簡體   English   中英

是否可以在C#中將靜態對象添加到列表中?

[英]Is it possible to add a static object to a list in C#?

我想通過將所有靜態類都添加到列表中來輕松訪問它們。

有沒有一種方法可以將這些靜態類添加到列表中? 我收到“此類型用作變量”的錯誤。

public static class PCM1_Setup : IGUI_to_BFC
{
    //PCM1_FORMAT
    public static void Setup_toBFC()
    {
        //uses the checkboxes to update the BFC
        //Determine the value to write to the field based on the check boxes
        RegmapInputReader.BitField BF;
        GB.BFC.name_to_BitField_Dict.TryGetValue("PCM1_FORMAT", out BF);
    }

    public static void Setup_fromBFC()
    {
        //Sets up the check boxes from the BFC
    }
}

public static class PC2
{
    List<IGUI_to_BFC> abe = new List<IGUI_to_BFC>();
    PC2()
    {
        abe.Add(PCM1_Setup); //ERROR HERE----------------------
    }
}

您不能將類型作為方法參數傳遞。 使PCM1_Setup類為非靜態類及其所有方法為實例方法(不帶static修飾符),並將該類的新實例作為abe.Add的參數abe.Add將解決此問題。

或者,您可以使abe的類型為List<Type>並使用typeof運算符添加對PCM1_Setup類的類型的引用。

List<Type> abe = new List<Type>();

PC2()
{
    abe.Add(typeof(PCM1_Setup));
}

然后,您可以使用Type.GetMethod函數調用它的任何方法(即反射):

foreach (Type T in abe)
{
    if (T == typeof(PCM1_Setup))
    {
        T.GetMethod("Setup_toBFC").Invoke(null, null);
    }    
}

請記住上面的示例,它不是最佳選擇,最好使用第一個示例。

您正在使用靜態類。 因此,您永遠不會有可以添加到列表中的實例。 如果要擁有一個實例並在每次需要時都無需創建新實例的情況下訪問它,則可以實現某種形式的單例。 然后,您可以將單例的實例添加到列表中。

public class PCM1_Setup : IGUI_to_BFC
{
    private static PCM1_Setup instance;

    public static PCM1_Setup Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new PCM1_Setup();
            }

            return instance;
        }
    }

    private PCM1_Setup()
    {

    }

    ...
}

PCM1_Setup類不再是靜態的。 該方法還應該實現為實例方法。 然后,將單例實例添加到示例中的列表中:

public static class PC2
{
    static List<IGUI_to_BFC> abe = new List<IGUI_to_BFC>();
    static PC2()
    {
        abe.Add(PCM1_Setup.Instance);
    }
}

注意,由於該類是靜態的,因此PC2類的構造函數也必須是靜態的。

實現IGUI_to_BFC類型列表的一個問題是,從列表中訪問項目時,必須將實例轉換為子類類型:

((PCM1_Setup)abe[0]).Setup_fromBFC();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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