我在变量中指定了类型:Type hiddenType
。我需要创建一个Func<T>
委托(delegate),其中T
是上述变量中指定的类型,并分配一个方法:
var funcType = typeof(Func<>).MakeGenericType(hiddenType);
Func<object> funcImplementation = () => GetInstance(hiddenType);
var myFunc= Delegate.CreateDelegate(funcType , valueGenerator.Method);
它不起作用-因为
funcImplementation
返回object
而不是所需的。在运行时,它肯定是hiddenType
中指定的类型的实例。GetInstance
返回object
,并且不能更改签名。 最佳答案
您可以通过手动构建表达式树并将类型转换插入hiddenType
来解决此问题。构造表达式树时,这是允许的。
var typeConst = Expression.Constant(hiddenType);
MethodInfo getInst = ... // <<== Use reflection here to get GetInstance info
var callGetInst = Expression.Call(getInst, typeConst);
var cast = Expression.Convert(callGetInst, hiddenType);
var del = Expression.Lambda(cast).Compile();
注意:上面的代码假定
GetInstance
是static
。如果不是静态的,则更改构造callGetInst
的方式以传递在其上调用方法的对象。关于c# - 通过反射创建通用功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30916280/