gpt4 book ai didi

c# - 在具有相同签名的.Net 3.5 中实现 Expression.Assign?

转载 作者:行者123 更新时间:2023-11-30 14:36:48 24 4
gpt4 key购买 nike

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/

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