Как можно привести объект (как в var объекта типа), используя Reflection? (Специфично для OFX)
Я использую Reflection, чтобы избежать явного приведения в глубокое копирование состояния плагина видео 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 без явного приведения. Компилятор и intellisense всегда показывают IEnumerable как IEnumerable<>.
Так что с ключами объекта или объектом o (перечислителем), как я могу разбить их в Reflection, чтобы получить доступ? Я попытался вызвать метод CopyTo (полученный из Reflection) объекта Keyframes, но он выбрасывает объект, а не исключение экземпляра (что оказывается неверным при фактическом явном приведении перечисляемых ключевых кадров.) Как только я выясняю, как перечислять через Ключи объекта или выяснить, как превратить объект o в работающий перечислитель. Я уверен, что смогу получить остальные значения свойств, которые мне нужны. Структуру глубокого копирования никогда не придется обновлять, даже если вводятся новые типы параметров.
1 ответ
Было бы намного проще, если бы вы использовали соответствующий интерфейс. В этом случае вы можете использовать IEnumerable
интерфейс.
IEnumerable keys = parameter.GetType().GetProperty("Keyframes")
.GetValue(parameter, null) as IEnumerable;
Затем вы должны иметь дело с типом перечисляемых объектов, но с самим перечисляемым легче иметь дело.
IEnumerable
находится в System.Collections
пространство имен, а не System.Collections.Generic
,