0

所以我一开始对反射或动态类型一无所知,但我学到了很多。但是,我找不到一件事:动态类型的“as”等价物。

我正在尝试做的是相当于这个(如果它会编译):

foreach (Change c in changes)
{
    (c.Undo as Action<c._Type, c._Type>).Invoke(
        c.OldValue as c._Type, c.NewValue as c._Type);
}

据我了解,我需要做一些事情

Type constructedClass = typeof(Action<,>).MakeGenericType(c._Type);

构造所需的 Action 类,但有没有办法同时实现asAction 类型和 c._Type?

为了进一步澄清,这里是伪代码(这是我第一次尝试做这种事情,所以请善待):

foreach (Object o in objects)
{
    (o.SettableMethod as Action<o.TypeOfParameters, o.TypeOfParameters>).Invoke(
        o.Parameter1 as TypeOfParameters, o.Parameter2 as TypeOfParameters);
}

提前致谢。

4

1 回答 1

1

Action 上的泛型(或一般而言)的目的是允许您在编译时管理类型安全。如果您使用反射,那么您正在做额外的工作而无法获得这种好处。如果需要,您不妨让 Undo Action 的签名采用两个 type 对象object,并在操作内转换为适当的类型。

更一般地说,不同的设计会更好地为您服务。你为什么要调用一个Change发送Change回属性的方法?你能不能在没有任何参数的情况下调用 Undo,并Change负责知道新旧值是什么?

于 2012-06-01T11:03:34.697 回答