【问题标题】:How to work around: AmbiguousMatchException in Expression.Property(myNewExpression, "nameOfproperty")如何解决:Expression.Property(myNewExpression, "nameOfproperty") 中的 AmbiguousMatchException
【发布时间】:2020-03-28 06:57:20
【问题描述】:

我有一个看起来像这样的类:

public class MyClass {
    public string id { get; set; }
    public string Id { get; set; }
    public string SomethingMore {get; set;}
}

我不控制班级。所以我必须接受id(小写i)和Id(大写I)都存在的事实。不管喜欢与否,我无法改变这一点,因此这个answer 回答了我的原因,但它没有回答我的操作方法问题。

在我的表达式树中,我有:

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。我只知道开发人员会倾向于在他们的类中同时定义idId

【问题讨论】:

  • Expression.Property 存在重载。明确获取属性信息并使用它。
  • 我是表达式树的新手。你能更明确一点吗?例子?
  • 最后,你到底想用这个表达式实现什么?
  • 我有一个查询表达式,它定义了一个基于一个或多个主键的查询,用于从 Cosmos Db 获取文档。 id 属性在 Cosmos Db 中具有特殊含义(即它是资源 ID),它可以根据这些主键自定义生成。我正在尝试使用我从查询中知道的那些主键创建 MyClass 的实例,以便我可以将此实例传递给生成器以创建资源 ID (id)。有关更多上下文,请参阅:github.com/dotnet/efcore/issues/17310。基本上,我正在尝试改进 EF Core 以与 Cosmos Db 一起使用。

标签: c# expression-trees


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2014-06-04
    • 2021-01-05
    • 1970-01-01
    相关资源
    最近更新 更多