如何判断您是在自己的构造函数中,还是在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);
}
}
}
我想避免传递某种布尔值来指示我从哪里来,因为那很难看。我能通过反射或其他方式做到这一点吗?
你可以使用:
if (GetType() == typeof(Super))
这将决定对象的实际类型。
但实际上我对这种模式一点也不确定。为什么不让Super.AssertInitialized
只检查Super
中的字段,让Sub.AssertInitialized
检查Sub
中的字段?使它们都是私有方法,并从两个构造函数调用它们。
编辑:只是为了清楚,我会让检查显式使用相关字段-不要在这里使用反射迭代-你知道所有字段是什么,所以为什么不使用它们?
让层次结构中的每个类检查自己的字段。如果在基类构造函数中抛出异常,则派生类构造函数将永远不会运行,因为异常将直接传播给调用者。
这允许每个类对自己的数据负责,随着时间的推移,这些数据应该更易于维护。(它还允许您直接检查初始化,而不是尝试依赖反射,这不仅更快,而且更易于使用和编写。)
嗯,或者在你的层次结构的最上面的类中添加你的数据一致性控件,或者添加一个Factory
,它构造你的对象,并检查它的数据。这是最"清晰"的解决方案。