“作为”等效使用反射
本文关键字:反射 作为 | 更新日期: 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
负责了解新旧值是什么?