如何判断您是在自己的构造函数中,还是在c#中基类的构造函数中

本文关键字:构造函数 基类 何判断 自己的 判断 | 更新日期: 2023-09-27 18:12:28

如果类Sub调用其基类Super的构造函数,是否有一种方法可以告诉它不仅仅是调用Super的构造函数?

我正在将数据从磁盘加载到对象中,并且我想验证使用反射的所有字段都不是空的。但是,如果我正在调用基构造函数,那么在所有构造函数完成之前检查这一点是不合适的。例子:

class Super
{
    string s;
    float? f;
    public Super(List<string> lines)
    {
        //initialize s and f based on lines
        if (notFromSubclassConstructor))
        { 
            AssertInitialized(this);
        }
    }
    public static void AssertInitialized(Super super)
    {
        // Iterate through every field and make sure it isnt null
        // I already know how to do this part. If we find a null
        // field we throw an exception.
    }
}
class Sub : Super
{
    string something;
    int? somethingElse;
    public Sub(List<string> lines)
        : base(lines) //we dont want to AssertInitialized inside here, we arent done yet!
    {
        //initialize blah blah
        if (notFromSubclassConstructor))
        { 
            AssertInitialized(this);
        }
    }
}

我想避免传递某种布尔值来指示我从哪里来,因为那很难看。我能通过反射或其他方式做到这一点吗?

如何判断您是在自己的构造函数中,还是在c#中基类的构造函数中

可以使用:

if (GetType() == typeof(Super))

这将决定对象的实际类型。

但实际上我对这种模式一点也不确定。为什么不让Super.AssertInitialized只检查Super中的字段,让Sub.AssertInitialized检查Sub中的字段?使它们都是私有方法,并从两个构造函数调用它们。

编辑:只是为了清楚,我会让检查显式使用相关字段-不要在这里使用反射迭代-你知道所有字段是什么,所以为什么不使用它们?

让层次结构中的每个类检查自己的字段。如果在基类构造函数中抛出异常,则派生类构造函数将永远不会运行,因为异常将直接传播给调用者。

这允许每个类对自己的数据负责,随着时间的推移,这些数据应该更易于维护。(它还允许您直接检查初始化,而不是尝试依赖反射,这不仅更快,而且更易于使用和编写。)

嗯,或者在你的层次结构的最上面的类中添加你的数据一致性控件,或者添加一个Factory,它构造你的对象,并检查它的数据。这是最"清晰"的解决方案。