gpt4 book ai didi

c# - 未知类型的 CreateDelegate

转载 作者:可可西里 更新时间:2023-11-01 08:42:17 26 4
gpt4 key购买 nike

我正在尝试创建委托(delegate)以在运行时读取/写入未知类型类的属性。

我有一个通用类 Main<T>和一个看起来像这样的方法:

Delegate.CreateDelegate(typeof(Func<T, object>), get)

哪里getMethodInfo应读取的属性。问题是当属性返回 int 时(我猜值类型会发生这种情况)上面的代码抛出 ArgumentException 因为无法绑定(bind)该方法。如果是字符串,效果很好。

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

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

现在的问题是 generic 的创建委托(delegate)实例所以我必须使用 DynamicInvoke这将与使用纯反射读取字段一样慢。

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

The return type of a delegate is compatible with the return type of a method if the return type of the method is more restrictive than the return type of the delegate

以及如何在第二个片段中执行委托(delegate)以使其比反射更快。

谢谢。

最佳答案

这是解决您的问题的一种方法。创建一个泛型方法:

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);
}

这样,C# 的编译器负责插入必要的装箱(如果有的话)来转换 f(t) (类型 U )到 object .现在你可以使用反射来调用这个 MakeDelegate使用 U 的方法设置为 @get.ReturnType ,你得到的将是一个 Func<T, object>无需使用 DynamicInvoke 即可调用.

关于c# - 未知类型的 CreateDelegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2490828/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com