繁体   English   中英

泛型的C#反射

[英]C# Reflection with generics

我已经搜索了一段时间,但没有找到任何地方。 我要执行以下操作:

给定类型说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对象获取“ 未类型化 ”的方法签名(而不是通过比较列表并弄清楚)

谢谢

编辑:也许这做了你想要的。 不知道您是否真的想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方法才能使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM