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

时间:2011-10-25 18:59:40

标签: c# reflection

如果一个Sub类调用它的基类Super的构造函数,有没有办法告诉它不仅仅是对Super的构造函数的调用呢?

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

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);
        }
    }
}

我想避免传递某种布尔值,表明我来自哪里,因为那是丑陋的。我可以用反射或其他方式以某种方式做到这一点吗?随意建议替代范例。

3 个答案:

答案 0 :(得分:7)

可以使用:

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

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

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

编辑:为了清楚起见,我会明确地使用相关字段进行检查 - 不要在这里使用反射进行迭代 - 你知道所有字段是什么,为什么不使用它们呢?

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

好吧,或者在层次结构中最顶级的类中添加数据一致性控件,或添加构造对象的Factory,并检查其数据。恕我直言是最“明确”的解决方案。