gpt4 book ai didi

c# - 遍历 lambda 表达式的属性?

转载 作者:行者123 更新时间:2023-11-30 23:26:56 25 4
gpt4 key购买 nike

我如何遍历表达式并根据装饰它们的自定义属性更改属性名称?

我使用以下代码获取属性的自定义属性,但它适用于具有一个属性的简单表达式:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com