通过反射创建通用功能

5 c# reflection delegates

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

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

var myFunc= Delegate.CreateDelegate(funcType , valueGenerator.Method);
Run Code Online (Sandbox Code Playgroud)

它不起作用-因为funcImplementation返回object而不是期望的。在运行时,它将肯定是中指定类型的实例hiddenType

GetInstance返回值object和签名不能更改。

das*_*ght 3

您可以通过手动构建表达式树并将强制转换插入到 来解决此问题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();
Run Code Online (Sandbox Code Playgroud)

注意:上面的代码假设GetInstancestatic. 如果它不是静态的,请更改构造方式callGetInst以传递调用该​​方法的对象。