我有一堆類都包含一個Shared
ReadOnly
字典。如果我想在類是泛型類型時訪問該字典(例如,當我有一個包裝函數將T作爲所有這些類實現的接口),那麼執行該操作的方法是什麼?當它是一個泛型類型時,從類中獲取共享成員?
基礎研究表明我想做類似GetType(T).GetMember("Dict")
的事情,但是這將返回MemberInfo
類型,並且不能轉換爲我定義的類型的字典。爲了以這種方式調用功能,可以使用委託+ CreateDelegate
+ GetMethod
。但是,GetMember似乎沒有相應的Create*
。或者我錯過了什麼?
如果我將GetMember
調用插入到立即窗口,然後使用下標就好像它是一個數組,然後調試輸出說我得到一個字典回來。但如果我在實際功能中使用相同的方法,我試圖寫,然後我得到一個關於System.Reflection.MemberInfo
不能轉換爲字典(X,Y)的錯誤
好的,這個工程。這是一些醜陋的代碼,但它的工作原理。但它也是_slow _...這很可能是因爲使用了反射,它總是一個表演豬。有沒有辦法緩存查找的一部分,以便未來的調用,而該程序正在運行的特定字典將不必再次執行反射?類似於這個想法是另一個問題,我[問這裏](http://stackoverflow.com/questions/4611890/faster-way-to-convert-from-a-string-to-generic-type-t- when-t-is-a-valueetype/4678430#4678430),它使用委託緩存函數指針。 – Kumba
PS,我還沒有探索過的一個想法是在基類中的每個子類中定義另一個存根函數(請參閱我對@competent_tech的評論,瞭解這些類都是什麼),拍攝該子類上的接口,並將該類綁定進入更高級的父類來調用主代碼。如果我無法緩存反射查找,或者這種緩存仍然很慢,那麼這可能是一種替代路線,但仍不會導致太多的函數調用開銷。真的,這樣做的真正目的是爲了避免在我的項目中的字典中出現'.Item'多個語句到'.ContainsKey'。 – Kumba
好吧,我只是對存根函數的想法進行了基準測試,它完全吸引了我的原始實現,儘管在覈心上,它添加了_two_函數調用,並仍然在字典上執行'.ContainsKey'後跟'.Item'。在10萬次的緊密時序循環中,比直接調用'.ContainsKey'和'.Item'要快200ms。我想知道是否通過將這些調用移動到包含子類中,我以某種方式激活了.NET內部的緩存機制,從而提高了性能? – Kumba