的(散)考慮下面的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動態改變調用者,一旦你有結果,但真的是太多的工作......也許在其他地方尋找優化?對不起,我忍不住。 –
感謝您抽出時間! –