生成MemberExpression的签名(哈希)

时间:2012-05-05 00:38:32

标签: c# lambda

考虑以下MemberExpressions

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生成签名\ hash的最佳\最有效方法。

我尝试过一些东西,但实际上它们减慢了代码速度。这个方法需要足够快以便每次都生成哈希,以便它可以用于查找,显然必须比遍历表达式更快。<​​/ p>

有什么想法?

编辑: 代码在这里:https://github.com/bryanmig/MongoFluentUpdater/blob/master/FluentUpdate/FluentUpdater.cs (我知道有改进的余地,但它是早期的原型)

1 个答案:

答案 0 :(得分:0)

您始终希望缓存反射工作的结果,因为在代码运行时,任何结果都不会更改(除非您执行大量动态程序集加载/生成)。你能分享遍历表达式的代码吗?这可能会让您更容易看到需要合并缓存的位置。