如何解决:Expression.Property(myNewExpression, "nameOfproperty") 中的 AmbiguousMatchException
How to work around: AmbiguousMatchException in Expression.Property(myNewExpression, "nameOfproperty")
我有一个看起来像这样的 class:
public class MyClass {
public string id { get; set; }
public string Id { get; set; }
public string SomethingMore {get; set;}
}
我不控制 class。所以我不得不接受 id
(小写 i)和 Id
(大写 I)都存在的事实。不管喜欢与否,我都无法更改它,因此 回答了我的原因,但没有回答我的操作方法问题。
在我的表达式树中我有:
var newExpression = Expression.New(typeof(MyClass).GetConstructor(Type.EmptyTypes))
var propertyExpression = Expression.Property(newExpression, "Id");
第二行抛出 Ambiguous Match Exception
,因为 Expression.Property(..)
不区分大小写 - 例如Expression.Property(newExpression, "SomethingMore")
不会 抛出异常。
我有哪些解决方法?
代码的下一步是:
Expression.Assign(propertyExpression, Expression.Constant("someNewValue", typeof(string));
我不需要给id
赋值属性而且我知道id
的意思,很特别。但是我确实需要能够为 Id
属性.
赋值
我想我可以创建我的 MyClass
的派生版本,它不包括 id
属性,但我需要在 运行 处执行此操作-时间。如果这是解决方案,该怎么做?或者,也许有更好的解决方案?
我不控制 MyClass
。我只知道开发人员倾向于在 class.
中同时定义 id
和 Id
Expression.Property
有重载,允许以更明确的方式访问所需的 属性。
使用反射显式获取 属性 信息并使用它。
var type = typeof(MyClass);
var newExpression = Expression.New(type.GetConstructor(Type.EmptyTypes));
PropertyInfo property = type.GetProperty("Id");
var propertyExpression = Expression.Property(newExpression, property);
我有一个看起来像这样的 class:
public class MyClass {
public string id { get; set; }
public string Id { get; set; }
public string SomethingMore {get; set;}
}
我不控制 class。所以我不得不接受 id
(小写 i)和 Id
(大写 I)都存在的事实。不管喜欢与否,我都无法更改它,因此
在我的表达式树中我有:
var newExpression = Expression.New(typeof(MyClass).GetConstructor(Type.EmptyTypes))
var propertyExpression = Expression.Property(newExpression, "Id");
第二行抛出 Ambiguous Match Exception
,因为 Expression.Property(..)
不区分大小写 - 例如Expression.Property(newExpression, "SomethingMore")
不会 抛出异常。
我有哪些解决方法?
代码的下一步是:
Expression.Assign(propertyExpression, Expression.Constant("someNewValue", typeof(string));
我不需要给id
赋值属性而且我知道id
的意思,很特别。但是我确实需要能够为 Id
属性.
我想我可以创建我的 MyClass
的派生版本,它不包括 id
属性,但我需要在 运行 处执行此操作-时间。如果这是解决方案,该怎么做?或者,也许有更好的解决方案?
我不控制 MyClass
。我只知道开发人员倾向于在 class.
id
和 Id
Expression.Property
有重载,允许以更明确的方式访问所需的 属性。
使用反射显式获取 属性 信息并使用它。
var type = typeof(MyClass);
var newExpression = Expression.New(type.GetConstructor(Type.EmptyTypes));
PropertyInfo property = type.GetProperty("Id");
var propertyExpression = Expression.Property(newExpression, property);