Delegate.DynamicInvoke太慢,如何更改调用Invoke?

Khh*_*Khh 1 c# delegates dynamic invoke .net-3.5

我已经读过我应该创建并重用委托来获取对象属性的值.

我使用此代码来创建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()
Run Code Online (Sandbox Code Playgroud)

现在我只找到在"DynamicInvoke"调用中使用委托的方法.

现在我想将调用更改为"调用"导致性能原因.

我试过了

Delegate.Method.Invoke(invokedObject, null);
Run Code Online (Sandbox Code Playgroud)

但是在通话结束后我得到了例外

MethodInfo must be a RuntimeMethodInfo.
Run Code Online (Sandbox Code Playgroud)

我有每个属性的缓存类,我可以存储动态创建的委托.

我应该怎么做才能使用"普通"调用?

非常感谢.

cdh*_*wie 6

您将不得不发出一个Func<object,object>委托,并在lambda内部和必要时进行转换,并检索结果.如果在编译时不知道委托的类型,则不能直接调用它,因为您不知道它采用何种类型的参数,也不知道返回类型是什么.

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