是否可以在C#中向列表中添加静态对象?

时间:2015-04-21 01:53:10

标签: c#

我有一堆静态类,我想通过将它们全部添加到List中来轻松访问。

有没有办法将这些静态类添加到列表中?我得到一个"这种类型用作变量"错误。

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

2 个答案:

答案 0 :(得分:0)

您无法将类型作为方法参数传递。使PCM1_Setup类非静态及其所有方法实例方法(不带static修饰符)并将类的新实例作为abe.Add的参数传递将解决问题。< / p>

或者,您可以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);
    }    
}

请记住上面的示例,这不是最佳选择,您最好使用第一个。

答案 1 :(得分:0)

您正在使用静态类。所以你永远不会有可以添加到列表中的实例。如果您希望拥有单个实例并在不需要每次创建新实例的情况下访问它,您可以实现某种形式的单例。然后,您可以将单例的实例添加到列表中。

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