2012-05-05 48 views
1

的(散)考虑下面的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 (我知道有改进的空间,但它是一个早期的原型)

回答

0

你总是希望缓存你的反映工作的结果没有任何结果将代码运行时更改(除非您进行大量的动态组装加载/生成)。你能分享正在遍历表达式的代码吗?这可能会使您更容易看到需要将缓存合并到哪里。

+0

是的,更新了链接到github的帖子 –

+0

我拉下它,并得到它在本地编译,但我找不到表达式的任何唯一标识符来建立一个缓存。我尝试使用System.Runtime.Interop内存地址,但我怀疑你想引入不安全的代码,我不确定它会更快。也许你可以用Refletion.Emit动态改变调用者,一旦你有结果,但真的是太多的工作......也许在其他地方寻找优化?对不起,我忍不住。 –

+0

感谢您抽出时间! –