“as”等效使用反射

时间:2012-06-01 10:46:33

标签: c# reflection

所以我开始时没有关于反射或动态类型的知识,但我学到了很多东西。但是,有一件事我找不到:动态打字的“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类,但是有没有办法为Action类型和c._Type实现as

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

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

提前致谢。

1 个答案:

答案 0 :(得分:1)

Action上(或一般)泛型的目的是允许您在编译时管理类型安全。如果你使用反射,你正在做额外的工作而不是获得这种好处。您也可以使用撤消操作的签名获取两个类型为object的对象,并在需要时将其强制转换为操作中的相应类型。

更一般地说,通过不同的设计可以提供更好的服务。为什么要调用Change上发送Change属性的方法?您是否可以在没有任何参数的情况下调用撤消,并让Change负责了解新旧值是什么?