作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我如何遍历表达式并根据装饰它们的自定义属性更改属性名称?
我使用以下代码获取属性的自定义属性,但它适用于具有一个属性的简单表达式:
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;
编辑
派生自 ExpressionVisitor
,我可以通过覆盖方法 VisitMember
来更改属性名称。
这是唯一使用属性名称构建表达式的地方吗?
最佳答案
您可以实现 System.Linq.Expressions.ExpressionVisitor
以使用新的映射属性重写 MemberExpression
。是的,VisitMember
是您必须实现此重新映射的唯一位置,这是表达式树和访问者的优势之一。您必须处理的唯一奇怪情况是属性的类型是否与映射属性的类型不同。
void Main()
{
var data = new List<TestClass>();
data.Add(new TestClass()
{
FirstName = "First",
LastName = "Last",
});
var q = data.AsQueryable().Select(x => x.FirstName);
var vistor = new MyRewriter();
var newExpression = vistor.Visit(q.Expression);
var output = newExpression.ToString();
//System.Collections.Generic.List`1[UserQuery+TestClass].Select(x => x.LastName)
}
class TestClass
{
[MyAttribute(nameof(LastName))]
public string FirstName { get; set; }
public string LastName { get; set; }
}
class MyAttribute : Attribute
{
public string MapTo { get; }
public MyAttribute(string mapTo)
{
MapTo = mapTo;
}
}
class MyRewriter : ExpressionVisitor
{
protected override Expression VisitMember(System.Linq.Expressions.MemberExpression node)
{
var att = node.Member.GetCustomAttribute<MyAttribute>();
if (att != null)
{
var newMember = node.Expression.Type.GetProperty(att.MapTo);
if (newMember != null)
{
return Expression.Property(
Visit(node.Expression), // Its very important to remember to visit the inner expression
newMember);
}
}
return base.VisitMember(node);
}
}
您可以在 LinqPad 中运行它来测试它。此代码假定您正在映射到一个属性。
关于c# - 遍历 lambda 表达式的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36716464/
我是一名优秀的程序员,十分优秀!