gpt4 book ai didi

c# - 'System.Int32' 类型的 ParameterExpression 不能用于 'System.String' 类型的委托(delegate)参数

转载 作者:太空狗 更新时间:2023-10-30 00:55:20 28 4
gpt4 key购买 nike

我正在使用表达式树创建通用 setter,这是我的代码

public Expression<Action<T,string>> GetAction<T>(string fieldName)
{
ParameterExpression targetExpr = Expression.Parameter(typeof(T), "Target");
MemberExpression fieldExpr = Expression.Property(targetExpr, fieldName);
ParameterExpression valueExpr = Expression.Parameter(fieldExpr.Type, "value");
UnaryExpression valueCast = (!fieldExpr.Type.IsValueType)
? Expression.TypeAs(valueExpr, fieldExpr.Type)
: Expression.Convert(valueExpr, fieldExpr.Type);
BinaryExpression assignExpr = Expression.Assign(fieldExpr, valueCast);
return Expression.Lambda<Action<T, string>>(assignExpr, targetExpr, valueExpr);
}

我没有在上面的方法中调用 .Compile(),因为我想检查它构建的表达式。

我的对象是

class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }

}

我这样调用方法

var lastname = GetAction<Person>("FirstName");
var age = GetAction<Person>("Age");

lastname.Compile()(p, "Solutions");
age.Compile()(p, "10");

我将年龄作为字符串传递的原因是,我将从 XML 中获取此值。

它正在为 FirstName 创建 Action,没有任何错误,而为 Age 创建 Action。

Age 这一行发生错误:

 return Expression.Lambda<Action<T, string>>(assignExpr, targetExpr, valueExpr);

错误:

ParameterExpression of type 'System.Int32' cannot be used for delegate parameter of type 'System.String'

我可以用动态做点什么吗?

我希望有人能提供一些解决方案。谢谢

最佳答案

你应该调用Convert.ChangeType对于类型转换:

public static Expression<Action<T, string>> GetAction<T>(string fieldName)
{
ParameterExpression targetExpr = Expression.Parameter(typeof(T), "Target");
MemberExpression fieldExpr = Expression.Property(targetExpr, fieldName);
ParameterExpression valueExpr = Expression.Parameter(typeof(string), "value");
MethodCallExpression convertExpr = Expression.Call(typeof(Convert),
"ChangeType", null, valueExpr, Expression.Constant(fieldExpr.Type));
UnaryExpression valueCast = Expression.Convert(convertExpr, fieldExpr.Type);
BinaryExpression assignExpr = Expression.Assign(fieldExpr, valueCast);
return Expression.Lambda<Action<T, string>>(assignExpr, targetExpr, valueExpr);
}

关于c# - 'System.Int32' 类型的 ParameterExpression 不能用于 'System.String' 类型的委托(delegate)参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9927608/

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