2013-06-11 74 views
1

我正在使用Reflection來避免在深拷貝OFX視頻插件狀態時顯式強制轉換。如何使用反射來投射對象(如在var類型的對象中)? (OFX特定)

object pvalue = parameter.GetType().GetProperty("Value").GetValue(parameter, null); 

再後來....

OFXParameter newparameter = parameter on new plugin; 
      PropertyInfo pi = newparameter.GetType().GetProperty("Value"); 
      pi.SetValue(newparameter, pvalue, null); 

我成功地避免了鑄造參數(其中可存在的類型的一個不斷髮展的池)。現在的問題。每個OFX參數都有一個包含OFXKeyframes TValue,TKey的關鍵幀屬性。我無法找到一種方法來訪問關鍵幀列表,沒有明確的轉換。

object keys = parameter.GetType().GetProperty("Keyframes").GetValue(parameter,null); 
MethodInfo enumofkeys = keys.GetType().GetMethod("GetEnumerator"); 
object o = enumofkeys.Invoke(keys,null); 

我已閱讀每個響應解釋通用鑄造用IEnumerable的,但我必須失去了一些東西。我僅限於Net 3.5,限制爲2.0。沒有明確的轉換,我無法訪問IEnumerable。編譯器和智能感知始終將IEnumerable顯示爲IEnumerable <>。

因此,與任何對象鍵或對象o(枚舉),我怎麼能打破他們的反射來獲取訪問?我曾嘗試調用Keyframes對象的CopyTo方法(從反射中獲得),但它引發的對象不是實例異常(通過關鍵幀的實際顯式轉換被證明是錯誤的)。一旦我找出如何枚舉鍵對象或找出如何將o對象轉換爲函數枚舉器我相信我可以獲得我需要的其餘屬性值。即使引入了新的參數類型,深層複製結構也不會被更新。

+0

以何種方式使用反射比使用顯式強制清潔? –

+0

如果更新OFX參數(這是爲索尼拉斯維加斯擴展程序編寫的),如果沒有顯式轉換,深層複製將不會在意。如果我必須在下一個OFX版本或索尼拉斯維加斯版本中明確地轉換參數類型,我將不得不更新我的擴展。通過反射不關心值類型,任何參數類型都可以被複制而不需要投射。 – Blacksting

回答

0

,如果你用的相關接口這將是一個簡單得多。在這種情況下,您可以使用IEnumerable界面。

IEnumerable keys = parameter.GetType().GetProperty("Keyframes") 
    .GetValue(parameter, null) as IEnumerable; 

您必須處理枚舉對象的類型,但枚舉本身更容易處理。

IEnumerable位於System.Collections命名空間中,而不是System.Collections.Generic

+0

您錯過了(可能因爲OFX引用類型覆蓋)的位置,我無法訪問IEnumberable。你的代碼不能編譯。 IEnumerable不存在。它作爲IEnumerable <>存在。 – Blacksting

+0

我在想也許Sony.Vegas.dll的參考可能是重新定義某些東西,但我將不得不進一步調查。 – Blacksting

+0

'公共IEnumerable接口:IEnumerable'因爲.NET 2.0在mscorlib.dll定義......你肯定不能訪問'System.Collections.IEnumerable'? @ user2476277 – DarkSquirrel42

相關問題