如何解决: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.

中同时定义 idId

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);