具有未知类型的CreateDelegate

Gio*_*rgi 11 .net c# generics reflection delegates

我正在尝试创建Delegate,用于在运行时读取/写入未知类型类的属性.

我有一个泛型类Main<T>和一个如下所示的方法:

Delegate.CreateDelegate(typeof(Func<T, object>), get)
Run Code Online (Sandbox Code Playgroud)

哪个getMethodInfo应该阅读的属性.问题是当属性返回时int(我猜这种情况发生在值类型中),上面的代码抛出了ArgumentException,因为该方法无法绑定.在字符串的情况下,它运作良好.

为了解决这个问题,我更改了代码,以便使用生成相应的Delegate类型MakeGenericType.所以现在的代码是:

Type func = typeof(Func<,>);
Type generic = func.MakeGenericType(typeof(T), get.ReturnType);
var result = Delegate.CreateDelegate(generic, get)
Run Code Online (Sandbox Code Playgroud)

现在的问题是generic我必须使用创建的委托实例,DynamicInvoke这与使用纯反射来读取字段一样慢.

所以我的问题是为什么第一段代码失败了值类型.根据MSDN,它应该像它说的那样工作

如果方法的返回类型比委托的返回类型更具限制性,则委托的返回类型与方法的返回类型兼容

以及如何在第二个片段中执行委托,以便它比反射更快.

谢谢.

kvb*_*kvb 10

这是解决问题的一种方法.创建一个通用方法:

public static Func<T, object> MakeDelegate<U>(MethodInfo @get)
{
    var f = (Func<T, U>)Delegate.CreateDelegate(typeof(Func<T, U>), @get);
    return t => f(t);
}
Run Code Online (Sandbox Code Playgroud)

这样,C#的编译器负责插入必要的装箱(如果有的话)以转换f(t)(类型U)object.现在,您可以使用反射来设置为调用此MakeDelegate方法,并且您将获得的内容将是可以调用而无需求助于使用.U@get.ReturnTypeFunc<T, object>DynamicInvoke