带有泛型的C#反射
本文关键字:反射 泛型 | 更新日期: 2023-09-27 18:29:54
我已经搜索了一段时间,但没有找到任何结果。我想做以下事情:
给定一个类型,比如Dictionary<string,MyClass>
和它的方法ContainsKey(string)
-在运行时我希望能够提取出这个方法的"通用签名"。这就是我想要的Boolean Dictionary<TKey,TValue>.ContainsKey(TKey)
(而非Boolean ContainsKey(string)
)
我知道这是可能的,通过做以下
var untyped_methods = typeof(DictObject).GetGenericTypeDefition().GetMethods();
// and extract the method info corresponding to ContainsKey
但是,可以直接从实际类型,而不是来自泛型类型?含义我能得到一般定义吗从以下方法中获得:
var actual_typed_methods = typeof(DictObject).GetMethods()
本质上,可以直接从上面第二个片段中返回的MethodInfo对象中获得"un-typed"方法签名(而不是通过比较列表和计算)
感谢
编辑:也许这符合你的要求。不确定你是否真的在看Invoke
如果调用,则为否(见下文)。如果您只想要定义,那么您可以使用typeof(Dictionary<,>)
来获得原始的泛型定义。
不幸的是,如果您想要Invoke
,则不能。
原因说明:
void Main()
{
var genericDictionaryType = typeof(Dictionary<,>);
var method = genericDictionaryType.GetMethod("ContainsKey");
var dict = new Dictionary<string, string>();
dict.Add("foo", "bar");
Console.WriteLine("{0}", method.Invoke(dict, new[] { "foo" }));
}
产生以下错误:
不能对ContainsGenericParameters为true的类型或方法执行后期绑定操作。
听起来很简单。只需调用method.MakeGenericMethod(typeof(string));
即可获得实际类型的MethodInfo
对象。
不幸的是,你不能。
布尔ContainsKey(TKey)不是GenericMethodDefinition。只能对MethodBase.IsGenericMethodDefinition为true的方法调用MakeGenericMethod。
原因是该方法定义为bool ContainsKey(TKey)
而不是bool ContainsKey<TKey>(TKey)
。
您需要从正确的Dictionary<TK,TV>
签名中获得ContainsKey
方法才能使用它。