1

我正在使用反射来避免在深度复制 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 方法(从 Reflection 获得),但它抛出了一个对象而不是实例异常(这被关键帧可枚举的实际显式转换证明是错误的。)一旦我弄清楚如何通过keys 对象或弄清楚如何将 o 对象转换为功能正常的枚举器我相信我可以获得所需的其余属性值。即使引入了新的参数类型,也永远不必更新深拷贝结构。

4

1 回答 1

0

如果你使用相关的接口会简单很多。在这种情况下,您可以使用该IEnumerable界面。

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

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

IEnumerableSystem.Collections命名空间中,而不是System.Collections.Generic.

于 2013-06-11T22:47:59.607 回答