[英]How to tell if you are in your own constructor, or your base class's constructor in c#
如果一個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
,並檢查其數據。 恕我直言是最“明確”的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.