[英]Call delegate (func/action) with generic argument in dynamic assembly
我想用通用 class 創建動態程序集:
class TestClass<T> where T : new() {
public T TestMethod() {
return f();
}
private Func<T> f;
}
因此,我創建了 class,添加了通用參數,設置約束並創建了如下委托:
var fieldType = typeof(Func<>).MakeGenericType(TArg);
// TArg = testClassBuilder.DefineGenericParameters("T")[0];
然后使用 IL 生成器,我嘗試發出調用Invoke
方法:
ilGenerator.Emit(OpCodes.Callvirt, fieldType.GetMethod("Invoke"));
但是我在GetMethod("Invoke")
調用上得到NotSupportedException
。 那么,如何使用Emit
調用這個委托呢?
您不能在typeof(Func<>).MakeGenericType(TArg)
上調用GetMethod
,因為在這種情況下, TArg
是一個GenericTypeParameterBuilder
,並且MakeGenericType
返回的Type
object 不知道如何獲取相關方法。
而是像這樣使用TypeBuilder.GetMethod
:
ilGenerator.Emit(
OpCodes.Callvirt,
TypeBuilder.GetMethod(
typeof(Func<>).MakeGenericType(genParam),
typeof(Func<>).GetMethod("Invoke")
));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.