2013-06-11 4 views
1

Я использую Reflection, чтобы избежать явного кастинга при глубоком копировании состояния плагина OFX.Каким образом объект (как в var объекта типа) должен быть отличен с помощью Reflection? (OFX specific)

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 имеет свойство keyframes, содержащее 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 без явного приведения. Компилятор и intellisense всегда показывают IEnumerable как IEnumerable <>.

Как с объектными ключами, так и с объектом o (перечислитель), как я могу разбить их в Reflection, чтобы получить доступ? Я попытался вызвать метод CopyTo (полученный из Reflection) объекта Keyframes, но он выбрасывает объект, а не исключение экземпляра (что доказано неправильно с помощью фактического явного набора ключевых кадров, перечислимых.) Как только я выясню, как перечислить через key object или выяснить, как включить объект o в функционирующий перечислитель. Я уверен, что могу получить остальные значения свойств, которые мне нужны. Глубокая структура копии никогда не будет обновляться, даже если будут введены новые типы параметров.

+0

Каким образом используется очиститель для отражения, чем использование явного литья? –

+0

Без явного приведения в действие, если параметры OFX обновляются (это написано для расширения Sony Vegas), глубокая копия не волнует. Если мне нужно явно указать типы параметров в следующей версии OFX или пересмотре Sony Vegas, мне придется обновить расширение. При отражении, не заботящемся о типах значений, любой тип параметра можно копировать без литья. – 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

'public interface IEnumerable : IEnumerable', как определено в mscorlib.dll с .net 2.0 ... вы уверены, что не можете получить доступ к' System.Collections.IEnumerable'? @ user2476277 – DarkSquirrel42