c# – 从反射创建通用Func

我在变量中指定了类型:键入hiddenType.我需要创建一个Func< T>委托其中T是在提到的变量中指定的类型并分配方法:

var funcType = typeof(Func<>).MakeGenericType(hiddenType);
Func<object> funcImplementation = () => GetInstance(hiddenType);

var myFunc= Delegate.CreateDelegate(funcType , valueGenerator.Method);

它不起作用 – 因为funcImplementation返回对象而不是期望的对象.在运行时,它肯定是hiddenType中指定的类型的实例.

GetInstance返回对象,并且无法更改signaure.

最佳答案 您可以通过手动构建表达式树并将强制转换插入到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是静态的.如果它不是静态的,请更改构造callGetInst的方式以传递调用该​​方法的对象.

点赞