gpt4 book ai didi

c# - 如何在 C# 中转换表达式树 lambda?

转载 作者:行者123 更新时间:2023-12-02 15:04:30 25 4
gpt4 key购买 nike

我有一个表达式树表达式

var lambdaExpr 

编译时会生成

Action<Type,int>

但是我想包装它并生成一个表达式,该表达式在编译时会生成

Action<object, int>

并且我需要强制对操作的第一个参数进行强制转换,以在将其传递给原始 lambda 之前将其转换

object --- cast ---> Type

如果无法进行强制转换,则执行时显然会出现运行时异常。

如何将原始表达式树表达式包装到新表达式树中?

具体来说,我需要在下面所示的位置添加一些额外的代码以获得正确的类型。

private static Action<object, TProp> GenerateSetter<TProp>(Type type, string propertyName )
{
var property = type.GetProperty
(propertyName, BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.NonPublic);
MethodInfo setterMethodInfo = property.SetMethod;
ParameterExpression paramo = Expression.Parameter(type, "param");
ParameterExpression parami = Expression.Parameter(typeof(TProp), "newvalue");
MethodCallExpression methodCallSetterOfProperty =
Expression.Call(paramo, setterMethodInfo, parami);
Expression setPropertyValueExp =
Expression.Lambda(methodCallSetterOfProperty, paramo, parami);

// This line below fails because setPropertyValueExp is an
// Action with first argument
// being the type passed in at runtime. I need to wrap it with a lambda that
// casts the object to the correct type.

var setPropertyValueLambda =
( Expression<Action<object, TProp>> ) setPropertyValueExp;
var setterFunc = setPropertyValueLambda.Compile();
return setterFunc;
}

最佳答案

您需要带上您的Action<Type,int> lambda 并生成 Action<object,int>执行强制转换并调用它的 lambda:

 var p=Expression.Parameter(typeof(object));
var conversion=Expression.Convert(p,type);
var call=Expression.Invoke(setPropertyValueExp,conversion);
var lambda=Expression.Lambda(call,p);
return lambda.Compile() as Action<object,int>;

关于c# - 如何在 C# 中转换表达式树 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21139925/

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