gpt4 book ai didi

c# - 使用带有 out 参数的动态调用方法

转载 作者:行者123 更新时间:2023-11-30 15:39:48 24 4
gpt4 key购买 nike

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

最佳答案

您不能这样做,因为在 .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);

关于c# - 使用带有 out 参数的动态调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10021265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com