“作为”等效使用反射

本文关键字:反射 作为 | 更新日期: 2023-09-27 18:36:11

所以我一开始对反射或动态类型一无所知,但我学到了很多东西。 但是,有一件事我找不到:动态类型的"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);
}

提前谢谢。

“作为”等效使用反射

操作(或一般情况下)泛型的目的是允许您在编译时管理类型安全。 如果你使用反射,你就是在做额外的工作来获得这种好处。 您也可以让撤消操作的签名采用两个类型 object 的对象,并在需要时强制转换为操作中的适当类型。

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