gpt4 book ai didi

c# - 未定义 MemberExpression 属性

转载 作者:太空宇宙 更新时间:2023-11-03 13:14:14 25 4
gpt4 key购买 nike

我需要帮助。我有两个类:实体和模型。他们的代码如下。

public class TestEntityForSerialize
{
public String FIO { get; set; }
public DateTime Birthday { get; set; }
public String Name { get; set; }
}

[DataContract]
public class TestModelForSerialize
{
[DataMember]
public String FIO { get; set; }
[DataMember]
public DateTime Birthday { get; set; }
[DataMember(Name = "Name")]
public String BigName { get; set; }
public Int32 Age { get; set; }
}

主要任务是以编程方式转换任何Func<TestModelForSerialize, Boolean>Func <TestEntityForSerialize, Boolean> .我的决定是使用表达式树。我正在使用 ExpressionVisitor 迭代模型的表达式树的节点,并构建一个以实体作为参数的新表达式。这些 Func 的通用参数在类中设置,具有功能。

我已经通过覆盖 VisitParameter 方法成功地转换了 ParameterExpression,但我一直坚持覆盖 ExpressionVisitor 的后代的 VisitMember 方法。事实上我有代码:VisitMember 覆盖:

    protected override Expression VisitMember(MemberExpression node)
{
Expression e = base.VisitMember(node);
MemberExpression me = e as MemberExpression;
if (me != null)
{
String modelPropertyName = ((PropertyInfo)me.Member).Name;
ParameterExpression pe = node.Expression as ParameterExpression;
TModel m = Activator.CreateInstance<TModel>();
PropertyInfo memberPI = GetEntityProperty(m, modelPropertyName);
MemberExpression meToReturn = Expression.Property(Expression.Parameter(typeof(TEntity)), memberPI);

return meToReturn;
}
else
{
return base.VisitMember(node);
}
}

访问参数覆盖:

    protected override Expression VisitParameter(ParameterExpression node)
{
ParameterExpression pe = base.VisitParameter(node) as ParameterExpression;
if (pe.Type == typeof(TModel))
{
ParameterExpression ex = Expression.Parameter(typeof(TEntity), pe.Name);
return ex;
}
else
{
return pe;
}
}

GetEntityProperty 是将TModel 类的属性映射到TEntity 类的属性的方法。它使用DataContract和DataMember进行映射。

    protected PropertyInfo GetEntityProperty(TModel model, String propertyName)
{
PropertyInfo property = model.GetType().GetProperty(propertyName);
if (property != null)
{
Attribute attr = property.GetCustomAttribute(typeof(DataMemberAttribute));
if (attr != null)
{
String entityPropertyName = (((DataMemberAttribute)attr).Name != null ? ((DataMemberAttribute)attr).Name : propertyName);
return typeof(TEntity).GetProperty(entityPropertyName);
}
else
{
throw new DataMemberAttributeNotFoundException();
}
}
else
{
throw new MissingMemberException();
}
}

测试方法是

    [TestMethod]
public void TestVisitMemberShouldReplaceModelWithEntity()
{
ParameterExpression p = Expression.Parameter(typeof(TestModelForSerialize));
Type tm = typeof(TestModelForSerialize);
PropertyInfo birthdayProp = tm.GetProperty("FIO");
Assert.IsNotNull(birthdayProp);
MemberExpression me = Expression.Property(p, birthdayProp);
VisitorForTests vft = new VisitorForTests();
MemberExpression meResult = vft.VisitMemberForTest(me) as MemberExpression;
Assert.IsInstanceOfType(meResult.Member, typeof(PropertyInfo));
}

VisitorForTests 是在类中调用 protected 方法的类,我正在尝试处理。方法:

    public Expression VisitMemberForTest(MemberExpression node)
{
return this.VisitMember(node);
}

当我尝试调用 VisitMember 方法时,它在第一行(“Expression e = base.VisitMember(node);”)中崩溃,抛出带有消息的 ArgumentException:属性“FIO”未在类“TestEntityForSerialize”中定义.我唯一能注意到的是 - VisitMember 尝试启动 VisitParameter 方法,并在获得结果后崩溃。

非常感谢任何帮助。

最佳答案

明白了!正如俄罗斯谚语所说的那样,“拯救正在沉没的人——是这个人自己的事。”。问题是——我试图使用带有错误参数的表达式。它应该与 TEntity 的属性一起提供,而我会为它提供 TModel 的属性。所以只需稍微更改 VisitMember 方法和 Qawabanga!

    protected override Expression VisitMember(MemberExpression node)
{
//Expression e = base.VisitMember(node); - I've commented this line
MemberExpression me = node as MemberExpression;
if (me != null)
{
String modelPropertyName = ((PropertyInfo)me.Member).Name;
ParameterExpression pe = node.Expression as ParameterExpression;
TModel m = Activator.CreateInstance<TModel>();
PropertyInfo memberPI = GetEntityProperty(m, modelPropertyName);
MemberExpression meToReturn = Expression.Property(Expression.Parameter(typeof(TEntity)), memberPI.Name);

return base.VisitMember(meToReturn); //and changed this line
}
else
{
return base.VisitMember(node);
}
}

这有效!

关于c# - 未定义 MemberExpression 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27156616/

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