使用带有out参数的dynamic调用方法

时间:2012-04-05 00:45:13

标签: c# dynamic

我有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& )

3 个答案:

答案 0 :(得分:3)

您不能这样做,因为在.Net中,用作refout参数的变量必须与该类型完全匹配。并且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;
} 

希望这对你有用!