如何使用Reflection来转换对象(如在var类型对象中)? (OFX具体)

时间:2013-06-11 22:25:50

标签: c# system.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参数都有一个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。编译器和智能感知始终将IEnumerable显示为IEnumerable<>。

因此,无论是对象键还是对象o(枚举器),我如何在Reflection中将它们分解才能获得访问权限?我已经尝试调用Keyframes对象的CopyTo方法(从Reflection获得),但它抛出一个对象而不是实例异常(通过可枚举的关键帧的实际显式强制转换证明这是错误的。)一旦我弄清楚如何枚举通过键对象或弄清楚如何将o对象转换为正常运行的枚举器我相信我可以获得我需要的其余属性值。即使引入了新的参数类型,也不必更新深层复制结构。

1 个答案:

答案 0 :(得分:0)

如果您使用相关界面,那将会简单得多。在这种情况下,您可以使用IEnumerable界面。

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

然后你必须处理枚举对象的类型,但是枚举本身更容易处理。

IEnumerable位于System.Collections命名空间中,而不是System.Collections.Generic