C# 生成MemberExpression的签名(哈希)

C# 生成MemberExpression的签名(哈希),c#,lambda,C#,Lambda,考虑以下表达式 someObject.someMethod(p => p.FirstName) someObject.someMethod(p => p.Contact.Address.City) 我正在编写一些代码,这些代码将遍历表达式并查看每个成员,以确定它是否用给定的属性修饰。其目的是生成如下“路径”: 但是,如果使用特定属性修饰路径,则将使用不同的名称生成路径: ... [BsonElement("Locale")] public string City {get; set

考虑以下表达式

someObject.someMethod(p => p.FirstName)
someObject.someMethod(p => p.Contact.Address.City)
我正在编写一些代码,这些代码将遍历表达式并查看每个成员,以确定它是否用给定的属性修饰。其目的是生成如下“路径”:

但是,如果使用特定属性修饰路径,则将使用不同的名称生成路径:

...
[BsonElement("Locale")]
public string City {get; set;}
...

p.Contact.Address.City -> "Contact.Address.Locale"
仅供参考:这是我为与MongoDB合作而编写的一个小型图书馆

因此,遍历表达式并检查属性是使用反射完成的。这并不十分缓慢,但仍有改进的余地

我想向路径解析添加一些缓存(MemberExpression到字符串中),但我不确定为MemberExpression生成签名\哈希的最佳\最有效的方法

我尝试了一些方法,但实际上它们减慢了代码的速度。此方法需要足够快,以便每次生成哈希,以便用于查找,并且显然必须比遍历表达式快

有什么想法吗

编辑: 代码如下:
(我知道还有改进的余地,但这是一个早期的原型)

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

我将其下拉并在本地编译,但找不到用于构建缓存的表达式的唯一标识符。我尝试使用System.Runtime.Interop之外的内存地址,但我怀疑您是否想引入不安全的代码,我也不确定它是否会更快。也许你可以尝试用Refletion.Emit动态地改变调用方,一旦你得到结果,但实际上这太麻烦了。。。也许在别处寻找优化?对不起,我帮不了你。无论如何,谢谢你抽出时间!
...
[BsonElement("Locale")]
public string City {get; set;}
...

p.Contact.Address.City -> "Contact.Address.Locale"