|
|
1
2
不幸的是,System.Reflection并不能提供一种将已构造类型上的方法与从中构造该方法的泛型类型定义上的相应方法相关联的好方法。我知道有两种解决方案,都不是完美的:
解决方案1:静态typebuilder.getmethod。
有
a static version of GetMethod on TypeBuilder
接受泛型类型定义上的方法的泛型构造类型和MethodInfo,并返回
指定的泛型类型上的对应方法。在本例中,调用
(当然,上面的示例不会编译;我已经使用了
坏消息是,只有当泛型类型定义是一个类型生成器时,这才有效,也就是说,当您发出一个泛型类型时。
解决方案2:metadatatoken。
在从泛型类型定义到泛型构造类型的转换中,类型成员保留其metadatatoken是一个鲜为人知的事实。所以在你的例子中,
(这也不会编译,除非我非常幸运并且第一次成功地编译了它:) 这个解决方案的问题是,metadatatoken并不是为了这个(很可能,文档在这个方面有点肤浅),它感觉像一个肮脏的黑客。尽管如此,它还是有效的。 |
|
|
2
1
使用foo<int>时,bar(t)方法被类型化为bar(int),它与定义了int作为参数的方法没有区别。 要获得bar(t)的正确方法定义,可以使用typeof(foo<>)而不是typeof(foo<int>)。 这将使你能够分辨出两者的区别。尝试以下代码:
这将输出:
系统字符串条(T)
|
|
|
3
1
尝试查看泛型类型定义:typeof(foo<>)。这些方法的顺序相同。
containsGenericParameters属性对于foo中的两个bar为true,对于foo中的两个bar为false,因此它是无用的。 |
|
|
4
0
|
|
|
5
0
正如EricLippert指出的,它们都不是通用方法;您的 班 是泛型的,但您传递的是类的非泛型实例。因此,这些方法不是反射看到它的一般方法。 如果你换衣服的话,你应该走在正确的轨道上
到
有关详细信息,请参阅 MSDN's documentation . |