.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"));