2012-05-05 85 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

感謝您抽出時間! –