【问题标题】:Generate signature (hash) of MemberExpression生成 MemberExpression 的签名(哈希)
【发布时间】:2012-05-05 10:27:19
【问题描述】:

考虑以下 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"

仅供参考:这是我为使用 MongoDB 编写的一个小型库

因此,遍历表达式并检查属性是使用反射完成的。它不是很慢,但还有改进的余地。

我想为路径解析添加一些缓存(将成员表达式转换为字符串),但我不确定为成员表达式生成签名\哈希的最佳\最有效方法。

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

有什么想法吗?

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

【问题讨论】:

    标签: c# lambda


    【解决方案1】:

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

    【讨论】:

    • 我将其拉下来并在本地编译,但我找不到用于构建缓存的表达式的任何唯一标识符。我尝试使用 System.Runtime.Interop 之外的内存地址,但我怀疑您是否想引入不安全的代码,而且我不确定它是否会更快。也许您可以尝试在获得结果后使用 Refletion.Emit 动态更改调用方,但实际上工作量太大...也许在其他地方寻找优化?抱歉,我帮不上忙。
    • 感谢您抽出宝贵时间!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多