Singleton继承List <t> </t>

时间:2011-11-14 13:46:42

标签: c# list singleton

我按照这样构建了我的课程:

public class MyList: List<MyClass>
{
    internal static bool isConfigured;

    // singleton
    public MyList()
    {
        if (!MyList.isConfigured)
        {
            lock ("isConfigured")
            {
                if (!MyList.isConfigured)
                {
                    // add some elements to MyList parsing them from an XML
                    [..]

                    MyList.isConfigured = true;
                }
            }
        }
    }

    public static MyClass MyStaticMethod(int argument)
    {
        foreach (MyClass c in new MyList())
        {
            // do something
        }
        return // an instance of MyClass
    }

}

当我从单例外部调用MyList.MyStaticMethod()时,我得到以下异常:

[..]
MyClass mc = MyList.MyStaticMethod(1));
[..]

An object reference is required for the non-static field, method, or property 'MyList.get'

我该如何解决这个问题?基于List放置单例类的最佳原因是什么?感谢

3 个答案:

答案 0 :(得分:5)

和其他单身人士一样。

public class MyList: List<MyClass> {
  private readonly static MyList instance = new MyList();

  private MyList() { }

  public static MyList Instance 
  { 
    get 
    {
       return instance;
    }
  }
}

答案 1 :(得分:1)

根据错误消息:

  

非静态字段,方法或属性“MyList.get”

需要对象引用

认为这只是一个名称冲突的情况,例如:

class Foo {
    static void Bar() {
        MyClass mc = MyList.MyStaticMethod(1); // your erroring line
    }
    string MyList {get;set;} // the data-type is not important here
}

在这种情况下,修复是否符合MyList类型与本地成员MyList的对应关系:

MyClass mc = SomeNamespace.MyList.MyStaticMethod(1); // your erroring line

其中SomeNamespaceMyList类的命名空间,或者它是根命名空间:

MyClass mc = global::MyList.MyStaticMethod(1); // your erroring line

注意:我不能以所描述的方式解决这个错误,但事实上它正在谈论一个属性访问者,这让我觉得这可能是相关的。

答案 2 :(得分:0)

您无法通过继承实现singleton。您必须拥有静态composite字段才能使singleton生效。

当您调用构造函数时,实际上是在创建MyList的新实例并且static字段为isConfigured

根据规定,关于您的问题的最佳做法是拥有一个Factory Method,它会为您提供具有您添加风味的MyList实例。

您要寻找的是从IList<T>实施,并使用List,它基本上是static列表。

public class MyList: IList<MyClass>
{
    private static MyList _myList = null;

    private MyList()
    {

    }

    //This is the factory method
    public static MyList GetInstance(int args)
    {
        return _myList ?? (_myList = new MyList());
    }

    public IEnumerator<MyClass> GetEnumerator()
    {
        return _myList.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public void Add(MyClass item)
    {
        _myList.Add(item);
    }

    public void Clear()
    {
        _myList.Clear();
    }

    public bool Contains(MyClass item)
    {
        return _myList.Contains(item);
    }

    public void CopyTo(MyClass[] array, int arrayIndex)
    {
        _myList.CopyTo(array, arrayIndex);
    }

    public bool Remove(MyClass item)
    {
        return _myList.Remove(item);
    }

    public int Count
    {
        get { return _myList.Count; }
    }

    public bool IsReadOnly
    {
        get { return _myList.IsReadOnly; }
    }

    public int IndexOf(MyClass item)
    {
        return _myList.IndexOf(item);
    }

    public void Insert(int index, MyClass item)
    {
        _myList.Insert(index, item);
    }

    public void RemoveAt(int index)
    {
        _myList.RemoveAt(index);
    }

    public MyClass this[int index]
    {
        get { return _myList[index]; }
        set { _myList[index] = value; }
    }
}

<强> USAGE

MyList myList = MyList.GetInstance();
var myClass = new MyClass();
myList.Add(myClass);
Assert.Equal(myClass, myList[0]); // yields true
// Now you basically an instance of List<MyClass>
// and which is singleton.