【发布时间】: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。我只知道开发人员会倾向于在他们的类中同时定义id和Id。
【问题讨论】:
-
Expression.Property存在重载。明确获取属性信息并使用它。 -
我是表达式树的新手。你能更明确一点吗?例子?
-
最后,你到底想用这个表达式实现什么?
-
我有一个查询表达式,它定义了一个基于一个或多个主键的查询,用于从 Cosmos Db 获取文档。
id属性在 Cosmos Db 中具有特殊含义(即它是资源 ID),它可以根据这些主键自定义生成。我正在尝试使用我从查询中知道的那些主键创建 MyClass 的实例,以便我可以将此实例传递给生成器以创建资源 ID (id)。有关更多上下文,请参阅:github.com/dotnet/efcore/issues/17310。基本上,我正在尝试改进 EF Core 以与 Cosmos Db 一起使用。
标签: c# expression-trees