的(散)考虑下面的MemberExpressions生成签名MemberExpression
someObject.someMethod(p => p.FirstName)
someObject.someMethod(p => p.Contact.Address.City)
我写一些代码,会走路的表达,并期待在每个成员以确定它是否是装饰用给定的属性或没有。这样做的目的是生成一个“路径”,例如:
p.Contact.Address.City -> "Contact.Address.City"
,但如果它是装饰用的特定属性,会使用不同的名称来生成的路径:
...
[BsonElement("Locale")]
public string City {get; set;}
...
p.Contact.Address.City -> "Contact.Address.Locale"
FYI :这是我为MongoDB编写的一个小型图书馆
因此,使用反射来完成表达式和检查属性。它不是非常缓慢,但有改进的余地。
我想添加一些缓存到路径解析(MemberExpression转换为字符串),但我不确定为MemberExpression生成签名\散列的最佳\最有效的方法。
我尝试了一些东西,但他们实际上放缓了代码。这种方法需要足够快以便每次生成散列,以便它可以用于查找,并且显然必须比行走表达更快。
有什么想法?
编辑: 的代码是在这里:https://github.com/bryanmig/MongoFluentUpdater/blob/master/FluentUpdate/FluentUpdater.cs (我知道有改进的空间,但它是一个早期的原型)
是的,更新了链接到github的帖子 –
我拉下它,并得到它在本地编译,但我找不到表达式的任何唯一标识符来建立一个缓存。我尝试使用System.Runtime.Interop内存地址,但我怀疑你想引入不安全的代码,我不确定它会更快。也许你可以用Refletion.Emit动态改变调用者,一旦你有结果,但真的是太多的工作......也许在其他地方寻找优化?对不起,我忍不住。 –
感谢您抽出时间! –