2009-01-05 48 views
3

在C#中,我使用屬性標記了某些類的屬性,並且我正在使用反射來查找這些屬性以執行獲取和設置。然而,我發現以這種方式進行反射的獲取/設置大約是POCO獲取/設置的10倍。除了放棄上述基本場景以使用替代技術之外,是否有任何文件化的技巧來使這種性能顯着提高,例如某種緩存技術?如何優化獲取/設置屬性裝飾屬性的性能?

回答

7

超越什麼casperOne說(包括有關檢查,這是瓶頸位),你會發現它非常有幫助的getter/setter方法轉換成代表(一Func<T>Action<T>的getter和setter分別)使用Delegate.CreateDelegate。這可以產生巨大的差異,而且不是非常困難。如果您已經要緩存PropertyInfo,請緩存委託對。

我有一個blog post about Delegate.CreateDelegate - 我在移植協議緩衝區(有時可能會反射很大)時首先使用它。在這種情況下,它幫了很多忙。

3

那麼,你可以隨時存儲屬性的PropertyInfo實例,一旦你得到它,並將其映射到任何關鍵作品爲您。由於類型是靜態的,PropertyInfo不會改變,並且存儲本地引用不會殺死你。

假設你不要做任何愚蠢的事情來緩存這個值(比如將所有PropertyInfo實例放在一個長列表中,並且每次迭代列表以找到它),你應該沒問題。

當然,在你走下這條道路之前,確保你沒有患過早疾病。確定在Type實例上不斷調用GetProperty/GetProperties是進行更改之前應用程序中的瓶頸。