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

标签 c# .net-4.0 .net-3.5 expression expression-trees

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/

相关文章:

c# - WebAPI + OWIN + SignalR + Autofac

c# - propertyInfo.PropertyType 和 propertyInfo.GetType 之间有什么区别?

.net - WCF 托管在 Web 应用程序和兼容模式中

entity-framework - Entity Framework 性能

c# - 了解自动实现的属性

c# - 字符串插值中的变量对齐组件

c# - Windows服务(错误1053)事件日志触发器

c# - 将通用列表传递给 ObservableCollection 构造函数

.net - 哪个版本的 .net 4.0 应该用于 Windows 服务(4.0 完整版或客户端配置文件)

c# - 协变和逆变中的 IsAssignableFrom