Ответ 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
полезен для.