Как я могу повторить выражение и изменить имена свойств на основе пользовательского атрибута, который я им украсил?Итерации через свойства лямбда-выражения?
Я использую следующий код, чтобы получить пользовательский атрибут свойства, но это работает для простого выражения с одним свойством:
var comparison = predicate.Body as BinaryExpression;
var member = (comparison.Left.NodeType == ExpressionType.Convert ?
((UnaryExpression)comparison.Left).Operand :
comparison.Left) as MemberExpression;
var value = comparison.Right as ConstantExpression;
var attribute = Attribute.GetCustomAttribute(member.Member, typeof(MyAttribute)) as MyAttribute;
var columnName = attribute.Name ?? member.Member.Name;
var columnValue = value.Value;
EDIT
Выведение из ExpressionVisitor
, я могу изменить имя свойства, переопределяя метод VisitMember
.
Это единственное место, где имя свойства используется для построения выражения?
Можете ли вы предоставить некоторые образцы того, что вы пробовали на данный момент? Вы не можете изменить выражение, но вы можете использовать посетителя выражения для создания копии вашей lamba: https://msdn.microsoft.com/en-us/library/bb546136.aspx – Thomas
Вы не можете изменять лямбда-выражения на месте, поэтому вам нужно переписать выражение динамически. Использование [Expression Visitor] (https://msdn.microsoft.com/en-us/library/bb546136 (v = vs.90) .aspx) - хороший подход. – dasblinkenlight