我有Dictionary<string,K>
,其中K是通过反射加载的类型,我不能命名为K.
不幸的是,我无法弄清楚我应该如何使用TryGetValue
方法。我尝试了几种不同的东西,它们都会导致异常。我该怎么办?
dynamic dict = GetDictThroughMagic();
dynamic d;
bool hasValue = dict.TryGetValue("name",out d);
bool hasValue = dict.TryGetValue("name",d);
我可以写更详细的if(dict.Contains("name")) d=dict["name"]
但我更愿意,如果我能写出更简洁的TryGetValue方法。
更新以包含实际例外:
Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: The
best overloaded method match for 'System.Collections.Generic.Dictionary<string,K>
.TryGetValue(string, out K)' has some invalid arguments
at CallSite.Target(Closure , CallSite , Object , String , Object& )
答案 0 :(得分:3)
您不能这样做,因为在.Net中,用作ref
和out
参数的变量必须与该类型完全匹配。并且dynamic
变量在运行时实际上是object
变量。
但你可以通过切换哪个参数out
以及哪个是返回值来解决这个问题,尽管使用它会比普通TryGetValue()
更不好:
static class DictionaryHelper
{
public static TValue TryGetValue<TKey, TValue>(
Dictionary<TKey, TValue> dict, TKey value, out bool found)
{
TValue result;
found = dict.TryGetValue(value, out result);
return result;
}
}
然后您可以这样称呼它:
dynamic dict = GetDictThroughMagic();
bool hasValue;
dynamic d = DictionaryHelper.TryGetValue(dict, "name", out hasValue);
答案 1 :(得分:1)
为什么使用dynamic
?这是通过互操作来的吗?我建议使用可以在这里使用的通用抽象。反射并不意味着动态,并且这个关键字在不需要的地方以静态语言抛出。它是为互操作而设计的......
更具体地针对您的问题:Here is what seems like a good answer。我不相信演员阵容可以在这里工作,因为它无法演绎K型。
答案 2 :(得分:0)
我最近遇到了类似的错误,但却找到了一个解决方案,使所有字典都能动态访问。
尝试
dynamic dict = GetDictThroughMagic();
dynamic value = "wacka wacka"; // I renamed from 'd' and gave it a value
dynamic key = "name";
if (dict.ContainsKey(key))
{
dict[key] = value;
}
希望这对你有用!