Expression.Bind() - что он на самом деле делает? - программирование
Подтвердить что ты не робот

Expression.Bind() - что он на самом деле делает?

Итак, я играл с динамическим построением деревьев выражений в последнее время и наткнулся на этот метод, который кажется странным. Сначала я подумал: "О, круто, это именно то, что мне нужно" после постоянного написания кода по строкам

var left = member is FieldInfo ? Expression.Field(instance, (FieldInfo)member) : Expression.Property(instance, (PropertyInfo)member);
var right = ...
var assign = Expression.Assign(left, right);

Да, я знаю, что есть вызов Expression.PropertyOrField(), но он обращается назад к размышлению, чтобы найти член по имени, где, как я уже сказал, есть экземпляр MemberInfo.

Так или иначе, я думал, что Expression.Bind() мне будет полезно, но он делает то, что я действительно не понимаю. Учитывая следующий код:

void Main()
{
    var m = typeof(Foo).GetField("Bar");
    Expression.Bind(m, Expression.Constant("")).Dump();
}

public class Foo
{
    public string Bar;
}

он выражает выражение MemberAssignment Bar = "". Но нет экземпляра и статической ссылки. Как я применил бы это выражение к экземпляру Foo? Я не могу найти пример использования этого метода.

4b9b3361

Ответ 1

выражения Object-Initializer.

Скажем, у вас было:

public class Foo
{
    public int Property { get; set; }
}

Тогда вы могли бы сделать:

var parameter = Expression.Parameter(typeof(int), "i");
var newExpr = Expression.New(typeof(Foo));
var bindExprs = new[]
    {
        Expression.Bind(typeof(Foo).GetProperty("Property"), parameter)
        // You can bind more properties here if you like.
    };

var body = Expression.MemberInit(newExpr, bindExprs);
var lambda = Expression.Lambda<Func<int, Foo>>(body, parameter);

что-то вроде:

i => new Foo { Property = i } 

Старый:

Я не могу помочь вам решить "проблему производительности", которую вы решили решить (будет ли использовать Expression.PropertyOrField действительно ввести узкое место в вашем приложении? Я несколько скептически. Вы должны определить это, прежде чем преждевременно оптимизировать ) ( РЕДАКТИРОВАТЬ: извинения за неправильное предположение, что это была первоочередная оптимизация, и, как вы сами выяснили, Expression.MakeMemberAccess - это то, что вам нужно), но я могу сказать вам, что Expression.Bind полезен для.