gpt4 book ai didi

c# - Delegate.DynamicInvoke 太慢,如何将调用更改为 Invoke?

转载 作者:太空宇宙 更新时间:2023-11-03 20:37:35 26 4
gpt4 key购买 nike

我读到我应该创建和重用委托(delegate)来获取对象属性的值。

我使用这段代码来创建委托(delegate)

    var objParm = Expression.Parameter(property.DeclaringType, "o");

Type delegateType = typeof(Func<,>).MakeGenericType(property.DeclaringType, property.PropertyType);

var lambda = Expression.Lambda(delegateType, Expression.Property(objParm, property.Name), objParm);

return lambda.Compile()

现在我只找到在“DynamicInvoke”调用中使用委托(delegate)的方法。

现在我想将调用更改为“invoke”,因为性能原因。

我试过了

Delegate.Method.Invoke(invokedObject, null);

但是在调用之后我得到了异常

MethodInfo must be a RuntimeMethodInfo.

我为每个属性都有一个缓存类,我可以在其中存储动态创建的委托(delegate)。

我应该怎么做才能使用“正常”调用?

非常感谢。

最佳答案

你必须发出 Func<object,object>委托(delegate),并在 lambda 内部和检索结果时根据需要进行强制转换。如果您在编译时不知道委托(delegate)的类型,则无法直接调用它,因为您不知道它需要什么样的参数,也不知道返回类型是什么。

另外,请注意,您可以围绕 property.GetGetMethod() 创建一个委托(delegate)-- 没有理由在这里编译你自己的方法。只需使用属性 getter 方法即可。

关于c# - Delegate.DynamicInvoke 太慢,如何将调用更改为 Invoke?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4430099/

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