反思:在基类中调用派生的属性获取器

时间:2018-09-04 12:42:20

标签: c# mvvm reflection conventions

在将代码集成到更大的系统期间,我遇到了一些代码约定问题。在下面的示例中,BaseClass和DerivedClass1是以前存在的大型系统,DerivedClass2是我的代码,在合并之前是从另一个基类继承的。

=SUM(A3:INDEX(A3:A5,E1)*B3:INDEX(B3:B5,E1))

Link

(更具体地说,BaseClass是MVVM的INotifyPropertyChanged的实现,它想对其通知属性进行一些自动连接。)

问题是,这里的哪种做法不好? 1)通过在基类中的反映来调用派生类成员,或2)属性获取器和方法依赖于其类的构造函数已经被调用的假设?我应该在所有属性中添加空检查和类似的逻辑,还是应该禁用此基类行为(如果我无论如何都不打算在代码中的任何地方使用PropertyEnvelop)?我有一种强烈的感觉,尝试调用尚未完全实例化的实例的属性的吸气剂是错误的(正如所提到的博客的second part所说),但是有任何官方指南建议使用一种替代方法另一个? (我们有复杂的ViewModel类,具有在ctor期间运行的许多内部逻辑。)

对我来说幸运的是,真正的BaseClass有一个禁用此行为的标志,但它是作为虚拟bool属性实现的,继承的类会覆盖它;因此,BaseClass还会在其构造函数中调用其虚拟成员,这(AFAIK)也是一种不好的代码习惯。

1 个答案:

答案 0 :(得分:0)

我的公司最终认为他们的原始模式是错误的,他们将更改基类的实现。这些建议是:

1)如果使用[WarningAlertThisWillBeInvokedBeforeYourCtorAttribute]标记要在基本构造函数中自动挂接的所有属性,那么至少将getter和警告放在一个位置。在Reflection中,您可以先检查属性,然后再调用getter。

2)如果您不想引入属性(例如,在这种情况下,引入了自动挂钩以尽可能加快开发速度),则至少可以检查 type 调用吸气剂之前的财产。然后您可以将警告放入类型摘要中,例如

/// <summary>
/// WARNING! Property of this type should be initialized inline, not in ctor!
/// </summary>
public class PropertyEnvelop
{
    (...)
}

3)通常,根本不要在基类ctor中调用属性getter,因此我们将寻求另一种解决方案。