我的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]"
说我有一个这样的方法:
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,而与键类型和值类型无关,如果是,我如何遍历这些对?
假设我有一个这样的模型类:
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 编码的?我需要编写自己的自定义转换器还是有更简单的方法?
我有以下两种扩展方法(方法的主体对我的问题不是特别重要,但无论如何包括代码)
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) 我发现自己一遍又一遍地写下以下内容:
if (myEnumerable != null) {
foreach (var element in myEnumerable) {
DoSomething(element);
}
}
Run Code Online (Sandbox Code Playgroud)
每次想要枚举时检查NULL都很繁琐,有更好的方法吗?例如,有没有办法覆盖枚举器以返回"Enumerable.Empty"而不是NULL?
假设我有以下方法:
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#中编写一个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) 我在今天早些时候将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版.