我正在使用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對象轉換爲函數枚舉器我相信我可以獲得我需要的其餘屬性值。即使引入了新的參數類型,深層複製結構也不會被更新。
以何種方式使用反射比使用顯式強制清潔? –
如果更新OFX參數(這是爲索尼拉斯維加斯擴展程序編寫的),如果沒有顯式轉換,深層複製將不會在意。如果我必須在下一個OFX版本或索尼拉斯維加斯版本中明確地轉換參數類型,我將不得不更新我的擴展。通過反射不關心值類型,任何參數類型都可以被複制而不需要投射。 – Blacksting