簡體   English   中英

如何判斷你是在自己的構造函數中,還是在c#中的基類構造函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM