在C#中,我使用屬性標記了某些類的屬性,並且我正在使用反射來查找這些屬性以執行獲取和設置。然而,我發現以這種方式進行反射的獲取/設置大約是POCO獲取/設置的10倍。除了放棄上述基本場景以使用替代技術之外,是否有任何文件化的技巧來使這種性能顯着提高,例如某種緩存技術?如何優化獲取/設置屬性裝飾屬性的性能?
3
A
回答
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是進行更改之前應用程序中的瓶頸。
相關問題
- 1. 如何獲得屬性獲取或設置屬性屬性
- 2. 如何使用屬性裝飾器來設置屬性?
- 3. 將屬性屬性設置爲裝飾類的類型
- 4. 從自定義屬性裝飾屬性獲取價值?
- 5. 獲得屬性修飾屬性的值
- 6. 如何獲取屬性設置的屬性名稱?
- 7. 獲取StackOverflowException設置屬性
- 8. C#獲取,設置屬性
- 9. 獲取和設置屬性
- 10. 獲取和設置屬性
- 11. 設置屬性的屬性
- 12. 裝飾物是裝飾物的屬性?
- 13. 裝飾軌中的屬性
- 14. 如何獲取屬性設置指令?
- 15. 如何獲取屬性重寫屬性?
- 16. 如何獲取屬性屬性列表?
- 17. Magento:如何獲取屬性集屬性?
- 18. CSS屬性,裝飾鏈接
- 19. Python忽略屬性獲取者的屬性設置器
- 20. 填充性能飾有一個屬性
- 21. 獲取一個屬性ID,設置爲另一個屬性ID
- 22. 設置數據屬性後無法獲取數據屬性
- 23. jQuery設置屬性,然後獲取屬性
- 24. 裝飾具有屬性的自定義屬性的方法
- 25. 如何從父屬性設置觸發設置子屬性
- 26. 如何優化下列設置元素的CSS屬性的JavaScript
- 27. 設置從父母的屬性屬性
- 28. 無法設置屬性的屬性
- 29. 未設置屬性的屬性?
- 30. 設置屬性