- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要帮助。我有两个类:实体和模型。他们的代码如下。
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/
我知道如何创建一个 MemberExpression 例如entity.Property // Expression: "entity" var parameter = Expression.Para
我正在尝试使用 Expression.MakeBinary 动态生成二进制表达式: public static BinaryExpression MakeBinary( ExpressionT
假设我有以下代码(我需要在更复杂的表达式中的任何位置包含此代码段)。 Type paraType = typeof(MyModel); var member = paraType.GetMember(
我有这个(在 C# MVC 项目中): public class Bindable { //(...) public IHtmlString FormControlTextField(
这里有人有编写自定义 Linq 提供程序的经验吗? 我想做的是判断作为业务对象属性的 MemberExpression 是否应该包含在 SQL 中,或者作为常量处理,因为它来自恰好是业务对象的局部变量
我们有以下实体: public class Employee { public int Serial { get; set; } public string FullName { ge
我正在尝试编写一个通用函数,它接受一个 MemberExpression 和一个对象,并返回成员表达式中定义的属性的值。 这是获取属性名称的代码示例。 public static TProperty
我正在为 MVC 创建一个表单生成器,我想通过以下方式模拟 Razor 对链式属性的处理: builder.TextBoxFor(x => x.User.Email); 这将以与 Razor 相同的方
想象一下以下类: class A { public string Test {get; set;} } class B : A { .. some other members .. }
我们正在努力使在我们系统的所有区域编写强类型代码变得容易,而不是设置 var sortColumn = "FirstName"我们想说sortOption = (p => p.FirstName) .
我需要帮助。我有两个类:实体和模型。他们的代码如下。 public class TestEntityForSerialize { public String FIO { get; set; }
我问类似的问题here,假设这种类型: public class Product { public string Name { get; set; } public string Title { g
给定这段代码: static void Main(string[] args) { Expression> test = i => i.Prop; var body = (UnaryE
所以,假设我在 C# 中有以下表达式: Expression> expr = () => foo.Bar; 如何提取对 foo 的引用? 最佳答案 I had the same problem, bu
描述 我有一个表达式指向我的类型的属性。但它不适用于所有属性类型。 "不是意思"是什么意思它导致不同的表达类型。我以为它会导致MemberExpression 但事实并非如此。 对于 int 和 Gu
根据我的 Select a model property using a lambda and not a string property name 的答案采取行动问题,想要向集合添加属性,如下所示:
我希望使用表达式树创建以下 Linq 表达式: var result2 = soldiers.OrderByDescending(soldier => soldier.Ranks.OrderBy(r=
我正在处理一个 linq 查询,并尝试按照 Mutilevel include in C# Linq 中的建议将实体包含到多个级别. 所以我写下这样的查询 query.Include(u => u.
以下成员表达式类型有时可以为 Nullable,我正在检查,但是我需要将其转换为不可为 null 的类型, MemberExpression member = Expression.Property(
下面的表达式将属性 NAME 与值 PETER 进行比较。 ParameterExpression pe = Expression.Parameter(typeof(T), "
我是一名优秀的程序员,十分优秀!