.net TypeBuilder上的TypeBuilder.GetMethod

.net TypeBuilder上的TypeBuilder.GetMethod,.net,reflection.emit,.net,Reflection.emit,TypeBuilder.GetMethod允许您获取由TypeBuilder关闭的泛型类型的方法,因此它允许我执行以下操作: TypeBuilder tb = .... // this would throw a NotSupportedException : // var ec = typeof(EqualityComparer<>). // MakeGenericType(tb).GetMethod("get_Default"); // this works: var

TypeBuilder.GetMethod
允许您获取由
TypeBuilder
关闭的泛型类型的方法,因此它允许我执行以下操作:

TypeBuilder tb = ....
// this would throw a NotSupportedException : 
// var ec = typeof(EqualityComparer<>).
//     MakeGenericType(tb).GetMethod("get_Default");

// this works:
var ec = TypeBuilder.GetMethod(tb, typeof(EqualityComparer<>).
    GetMethod("get_Default");
TypeBuilder tb=。。。。
//这将引发NotSupportedException:
//var ec=类型(相等比较)。
//MakeGenericType(tb).GetMethod(“get_Default”);
//这项工作:
var ec=TypeBuilder.GetMethod(tb,typeof(EqualityComparer)。
GetMethod(“获取默认值”);
不起作用的是(我还不知道如何让它起作用):

Type collectionOf=typeof(ICollection);
//throws:'类型必须是运行时提供的类型。
//参数名称:类型'
var colEc=TypeBuilder.GetMethod(collectionOf,typeof(EqualityComparer))。
GetMethod(“获取默认值”);
//抛出NotSupportedException
colEc=typeof(EqualityComparer)。MakeGenericType(collectionOf)。
GetMethod(“获取默认值”);

任何人都知道答案(我希望是42)…?

就像前面所说的,您不能对尚未创建的类型进行反射

您需要跟踪这些方法,或者确保您拥有从调用的
TypeBuilder返回的运行时类型。CreaterType()
TypeBuilder
“方便地”会跟踪已创建的运行时类型(如果已创建)

这适用于
reflection.Emit
类型中的几乎所有反射操作,而不仅仅是
TypeBuilder

更新:

我以前没有注意到
TypeBuilder.GetMethod
,所以我可能上面错了。我会找出细节的。:)

更新2:可能的解决方案

下面的方法有效吗

typeof(EqualityComparer<>).GetMethod("get_Default").MakeGenericMethod(tb)
typeof(EqualityComparer).GetMethod(“get_Default”).MakeGenericMethod(tb)


应该在测试:(

我不完全清楚您想做什么(看起来您缺少了一些括号,还有其他问题),但是如果您试图为
EqualityComparer.get_Default
获取
方法信息,这对我来说很有用:

var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("test"),
             AssemblyBuilderAccess.Run);
var mb = ab.DefineDynamicModule("test");
var tb = mb.DefineType("TestType");

var ico = typeof(ICollection<>);
var eq = typeof(EqualityComparer<>);

var m = TypeBuilder.GetMethod(eq.MakeGenericType(ico.MakeGenericType(tb)), eq.GetMethod("get_Default"));
var ab=AppDomain.CurrentDomain.DefinedDynamicAssembly(新程序集名称(“测试”),
AssemblyBuilderAccess.Run);
var mb=ab.DefinedDynamicModule(“测试”);
var tb=mb.DefineType(“TestType”);
var ico=类型(ICollection);
var eq=类型(相等比较);
var m=TypeBuilder.GetMethod(eq.MakeGenericType(ico.MakeGenericType(tb)),eq.GetMethod(“get_默认”);

不,TypeBuilder.GetMethod说该类型必须是类型生成器类型。@JeffN825-它对我有效-你看到了什么错误?我已经更新了答案,使其独立。这太奇怪了。1.你的示例在控制台应用程序中对我有效。2.我无法尝试捕获异常。3.堆栈跟踪没有遵循逻辑路径…在System.DefSystem.Type.GetMethod(字符串名称,类型[]类型)的System.RuntimeType.GetMethodImpl(字符串名称,BindingFlags bindingAttr,Binder Binder,CallingConventions callConv,Type[]类型,ParameterModifier[]修饰符)处的aultBinder.SelectMethod(BindingFlags bindingAttr,MethodBase[]match,Type[]类型,ParameterModifier[]修饰符)在TypeSystem.TypeGenerator.GenerateGetHashCode(TypeBuilder类型,IEnumerable`1字段)更奇怪的是:我不能在即时窗口中产生相同的行为!它在即时窗口中工作。似乎这个问题与TypeBuilder无关,而是在.NET运行时类型绑定器中出现了某种奇怪的问题……问题似乎是我这里没有一个我想要发出消息的TypeBuilder这是一个平等的比较。。。
var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("test"),
             AssemblyBuilderAccess.Run);
var mb = ab.DefineDynamicModule("test");
var tb = mb.DefineType("TestType");

var ico = typeof(ICollection<>);
var eq = typeof(EqualityComparer<>);

var m = TypeBuilder.GetMethod(eq.MakeGenericType(ico.MakeGenericType(tb)), eq.GetMethod("get_Default"));