Expression.Assign
在 .NET 4 之前不可用。我需要在 .NET 3.5 下使用原始签名实现此方法:
public static BinaryExpression Assign(
Expression left,
Expression right
)
澄清:我不是在寻找在某些情况下使用此方法的方法。我需要实现一般情况。
最佳答案
因为没有 ExpressionType.Assign
,所以您无法获得完全相同的值, 但有可能做出类似的事情:
public static class ExpressionEx
{
public static BinaryExpression Assign(Expression left, Expression right)
{
var assign = typeof(Assigner<>).MakeGenericType(left.Type).GetMethod("Assign");
var assignExpr = Expression.Add(left, right, assign);
return assignExpr;
}
private static class Assigner<T>
{
public static T Assign(ref T left, T right)
{
return (left = right);
}
}
}
然后你可以用它来生成作业:
class Foo
{
public int Data
{
get;
set;
}
}
class Program
{
static Action<object, object> MakeSetter(PropertyInfo info)
{
var objectParameter = Expression.Parameter(typeof(object), string.Empty);
var valueParameter = Expression.Parameter(typeof(object), string.Empty);
var setterExpression = Expression.Lambda<Action<object, object>>(
<strong>ExpressionEx.Assign</strong>(
Expression.Property(
Expression.Convert(objectParameter, info.DeclaringType),
info),
Expression.Convert(valueParameter, info.PropertyType)),
objectParameter,
valueParameter);
return setterExpression.Compile();
}
static void Main()
{
var foo = new Foo();
var property = typeof(Foo).GetProperty("Data");
var setter = MakeSetter(property);
setter(foo, 10);
Console.WriteLine(foo.Data);
}
}
如果你真的不需要BinaryExpression
作为返回类型,您可以使用 Expression.Call
而不是 Add
所以它不会那么骇人听闻。
关于c# - 在具有相同签名的.Net 3.5 中实现 Expression.Assign?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10122856/