gpt4 book ai didi

c# - 表达式树 GetString 结果

转载 作者:太空狗 更新时间:2023-10-29 21:39:06 30 4
gpt4 key购买 nike

我试图复制 Entity Framework 在从表达式创建查询时的行为,并且在使用 Attribute 获取模型属性时,我找到了使用 ExpressionVisitor 的方法

这就是我目前所得到的

    internal class NVisitor : ExpressionVisitor
{
private readonly ParameterExpression _parameter;
private readonly Type _type;

public NVisitor(Type type)
{
_type = type;
_parameter = Expression.Parameter(type);
}

protected override Expression VisitParameter(ParameterExpression node)
{
return _parameter;
}

protected override Expression VisitMember(MemberExpression node)
{

if (node.Member.MemberType == MemberTypes.Property)
{
var memberName = node.Member.Name;

PropertyInfo otherMember = _type.GetProperty(memberName);

var ncols = node.Member.GetCustomAttributes(typeof(NColumn), true);

if (ncols.Any())
{
var ncol = (NColumn)ncols.First();

otherMember = _type.GetProperty(ncol.Name);
}

var inner = Visit(node.Expression);
return Expression.Property(inner, otherMember);
}

return base.VisitMember(node);
}
}

我有一个属性NColumn,它指示表列中属性的真实名称,所以我通过属性标记模型的属性

    public class BonusTypeX
{
[NColumn("BonusTypeName")]
public string Name { get; set; }
}

现在当我试图获取表达式时,

    [TestMethod]
public void ExpressionTesting2()
{
string searchKey = "Xmas";

Expression<Func<BonusTypeX, bool>> expression = x => x.Name.Contains(searchKey);

Type t = typeof(tbl_BonusType);

var body = new NVisitor(t).Visit(expression.Body);

string a = string.Join(".", body.ToString().Split('.').Skip(1));


Assert.AreEqual("BonusTypeName.Contains(\"Xmas\")", a);
}

我明白了

BonusTypeName.Contains(value(Payroll.Test.Administration.TestRepositories+<>c__DisplayClass13).searchKey)

我期待的是

BonusTypeName.Contains("Xmas")

有没有获取表达式字符串的方法?我正在使用

string a = string.Join(".", body.ToString().Split('.').Skip(1));

我认为这可能是错误的..:)

如有任何帮助,我们将不胜感激。

最佳答案

局部变量在运行时在编译器生成的类中被捕获,这解释了 Payroll.Test.Administration.TestRepositories+<>c__DisplayClass13).searchKey部分。要在表达式中获取生成字段的值,您必须在访问表达式时显式替换它的值:

protected override Expression VisitMember(MemberExpression node)
{
if (node.Member.MemberType == MemberTypes.Property)
{
var memberName = node.Member.Name;
PropertyInfo otherMember = _type.GetProperty(memberName);
var ncols = node.Member.GetCustomAttributes(typeof(NColumn), true);
if (ncols.Any())
{
var ncol = (NColumn)ncols.First();
otherMember = _type.GetProperty(ncol.Name);
}

var inner = Visit(node.Expression);
return Expression.Property(inner, otherMember);
}
if (node.Member.MemberType == MemberTypes.Field)
{
if (node.Expression is ConstantExpression)
{
var owner = ((ConstantExpression)node.Expression).Value;
var value = Expression.Constant(((FieldInfo)node.Member).GetValue(owner));
return value;
}
}

return base.VisitMember(node);
}

关于c# - 表达式树 GetString 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26479620/

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