小编des*_*lsj的帖子

.NET将类解析为错误的DLL

我的C#项目引用了两个第三方DLL.这很重要,因为这意味着我无法访问源代码,也无法修改或重新编译这两个DLL.

让我们称他们为dll A和dll B.这是dll A的样子:

namespace ThirdParty.Foo
{
  public class Bar
  {
    ...snip...
  }

  public class Something
  {
    public Bar MyProperty { get; set; }
  }
}
Run Code Online (Sandbox Code Playgroud)

这就是dll B的样子:

namespace ThirdParty.Foo
{
  public class Bar
  {
    ...snip...
  }

  public class SomethingElse
  {
    public Bar MyProperty { get; set; }
  }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,它们具有相同的命名空间,并且它们都定义了具有相同名称的类.我的C#代码需要引用这两个DLL.我使用的参考别名属性能够在两个引用,我也来区分extern alias firstDll,并 extern alias secondDll在我的C#文件的顶部.到现在为止还挺好.

对我来说,似乎显而易见的Something.MyProperty是firstDll.ThirdParty.Foo.Bar的类型和secondDll.ThirdParty.Foo.Bar的类型,SomethingElse.MyProperty但由于某种原因,Visual Studio会混淆并将两个属性的类型解析为同一个Bar类中的firstDll.

有没有办法让我"强制"VisualStudio来解析正确的类型?

编辑:我在Visual Studio中得到的错误是:无法将类型'ThirdParty.Foo.Bar [d:\ MySolution\References\Second.dll]'隐式转换为'ThirpParty.Foo.Bar [d:\ MySolution\References\First.dll]"

c# visual-studio-2010

5
推荐指数
1
解决办法
1570
查看次数

如何在不知道键的类型和值的类型的情况下遍历KeyValuePair的枚举

说我有一个这样的方法:

public void Foo(object arguments)
Run Code Online (Sandbox Code Playgroud)

并说我需要检测的类型arguments是否实际上是枚举。我会这样写:

if (arguments is IEnumerable)
Run Code Online (Sandbox Code Playgroud)

现在,假设我需要检测它是否是KeyValuePair的枚举(无论键的类型和值的类型如何)。我的直觉是写这样的东西:

if (arguments is IEnumerable<KeyValuePair<,>>)
Run Code Online (Sandbox Code Playgroud)

但是视觉工作室抱怨到Using the generic type 'KeyValuePair<TKey, TValue>' requires 2 type arguments

我也尝试过:

if (arguments is IEnumerable<KeyValuePair<object, object>>)
Run Code Online (Sandbox Code Playgroud)

但如果键不是对象(例如string,例如)或值是对象(例如int,例如),则返回false 。

有人建议我如何确定枚举是否包含KeyValuePair,而与键类型和值类型无关,如果是,我如何遍历这些对?

c#

5
推荐指数
1
解决办法
177
查看次数

配置 Json.net 对特定字段进行 URL 编码

假设我有一个这样的模型类:

public class MyModelClass
{
    [JsonProperty("first_field"]
    public string FirstField { get; set; }

    [JsonProperty("second_field"]
    public string SecondField { get; set; }

    public MyModelClass(string first, string second)
    {
        FirstField = first;
        SecondField = second;
    }
}
Run Code Online (Sandbox Code Playgroud)

假设我有一个这种类型的实例:

var myObject = new MyModelClass("blablabla", "<>@%#^^@!%");
Run Code Online (Sandbox Code Playgroud)

当我使用 Json.net 将此对象转换为 Json 字符串时,我得到如下信息:

{ 'first_field': 'blablabla', 'second_field': '<>@%#^^@!%' }
Run Code Online (Sandbox Code Playgroud)

有没有办法配置 Json.net 以便“SecondField”的内容是 URL 编码的?我需要编写自己的自定义转换器还是有更简单的方法?

c# json.net

4
推荐指数
1
解决办法
2330
查看次数

两个具有相同名称的扩展方法

我有以下两种扩展方法(方法的主体对我的问题不是特别重要,但无论如何包括代码)

public static class DictionaryExtensions
{
    public static TValue GetValue<TKey, TValue>(this IDictionary<TKey, TValue> source, TKey key, TValue defaultValue)
    {
        return (source.ContainsKey(key) ? source[key] : defaultValue);
    }
}

public static class WebExtensions
{
    public static T GetValue<T>(this HttpContext context, string name, T defaultValue)
    {
        object value = context.Request.Form[name] ?? context.Request.QueryString[name];
        if (value == null) return defaultValue;
        return (T)value;
    }
}
Run Code Online (Sandbox Code Playgroud)

这两个方法共享相同的名称,但它们扩展了两种非常不同的类型.我希望以下代码很简单,编译器能够选择适当的扩展方法:

var myDict = new Dictionary<int, string>()
{
    { 1, "foo" },
    { 2, "bar" }
};
var result = myDict.GetValue(5, …
Run Code Online (Sandbox Code Playgroud)

c# extension-methods

3
推荐指数
2
解决办法
1719
查看次数

在循环之前检查空Enumerable

我发现自己一遍又一遍地写下以下内容:

if (myEnumerable != null) {
    foreach (var element in myEnumerable) {
        DoSomething(element);
    }
}
Run Code Online (Sandbox Code Playgroud)

每次想要枚举时检查NULL都很繁琐,有更好的方法吗?例如,有没有办法覆盖枚举器以返回"Enumerable.Empty"而不是NULL?

c# ienumerable

2
推荐指数
2
解决办法
269
查看次数

尝试声明 Func&lt;void&gt; 时,不能在此上下文中使用关键字“void”

假设我有以下方法:

private TResult CallWithSuccessHandler<TResult>(Func<TResult> func, System.Action onSuccess = null, System.Action onFailure = null)
{
    try
    {
        var result = func();
        if (onSuccess != null) onSuccess();
        return result;
    }
    catch (Exception ex)
    {
        if (onFailure != null) onFailure();
        throw;
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以像这样调用这个方法:

var simpleFunc = new Func<int>(() => { return 1; });
var result = CallWithSuccessHandler(simpleFunc, null, null);
Run Code Online (Sandbox Code Playgroud)

这在 Visual Studio 中编译没有任何问题并且工作正常。

但是,我无法弄清楚如何使用不返回任何内容的“Func”调用 CallwithSucessHandler 方法。换句话说,我需要“func”来返回“void”。

我尝试了以下操作:

var voidFunc = new Func<void>(() => { return; });
CallWithSuccessHandler(voidFunc, null, null);
Run Code Online (Sandbox Code Playgroud)

但 Visual Studio …

c# visual-studio-2012

2
推荐指数
1
解决办法
3496
查看次数

三个查理Linq查询

我正在尝试在C#中编写一个linq查询,该查询将返回收到他们订购的所有项目的客户列表,但无法弄清楚

我的数据库模式如下所示:
表名:Customers,主要字段:CustomerId
表名:订单,主要字段:OrderId,外键:CustomerId
表名:OrderLineItems,主要字段:LineItemId,外键:OrderId

行项目表还有一个名为"状态"的字段,其中我指示此项目是否已"订购","延期交货","已发货"等.

我正在寻找的是至少有一个订单的客户列表(我对没有订购任何东西的客户不感兴趣),我只对至少有一件商品的订单感兴趣(以防万一有人创建了一个订单)没有任何项目的空订单),最后我的最后一个标准是所有项目必须具有给定的状态(例如:'发货').

如果我要编写SQL查询,它看起来像这样:

SELECT  c.*
  FROM  Customers c 
        INNER JOIN Orders o ON c.CustomerId = o.CustomerId
        INNER JOIN (SELECT oli.OrderId, COUNT(*) AS [NumberOfItems] FROM OrderLineItems oli WHERE oli.Status <> 'Shipped' GROUP BY oli.OrderId) items ON o.OrderId = items.OrderId
 WHERE  items.NumberOfItems = 0
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,如果你能想到一个更好的方法来获取我正在寻找的数据),请随意提出更好的SQL查询

理想情况下,我会得到C#代码,看起来像这样:

var customers = from c in context.Customers
    where ...
    select c;
Run Code Online (Sandbox Code Playgroud)

c# linq

0
推荐指数
1
解决办法
82
查看次数

更新SDK时,Azure存储模拟器未升级

我在今天早些时候将Azure SDK升级到2.9.6,因为设置完成后没有任何错误消息让我相信它已成功完成.但是,我注意到存储模拟器仍然是版本4.5(我希望它升级到4.6).

我再次运行Web平台安装程序,但它说已安装了最新的SDK,无需升级.

有没有办法强制升级存储模拟器(除了卸载整个SDK并重新安装)?

更新: 我卸载了模拟器4.5,再次运行Web安装程序平台并检测到丢失的模拟器,我完成了安装,但令我惊讶的是,它再次安装了4.5版!安装模拟器4.6需要做什么?

顺便说一句,我想要模拟器4.6的原因是因为我已经升级了我的C#解决方案以使用需要最新模拟器的Azure存储nuget包8.0.0版.

azure-storage azure-compute-emulator

0
推荐指数
1
解决办法
972
查看次数