Список наследования синглтона <T> - PullRequest
0 голосов
/ 14 ноября 2011

Я структурировал свой класс так:

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 ]

5 голосов
/ 14 ноября 2011

Как и любой другой синглтон.

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

  private MyList() { }

  public static MyList Instance 
  { 
    get 
    {
       return instance;
    }
  }
}
1 голос
/ 14 ноября 2011

На основании сообщения об ошибке:

Ссылка на объект требуется для нестатического поля, метода или свойства 'MyList.get'

I думаю это просто случай, когда у вас есть конфликт имен, например:

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

где SomeNamespace - это пространство имен вашего MyList класса или, если это корневое пространство имен:

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

Примечание: я не могу получить это сообщение об ошибке, как описано выше, но тот факт, что речь идет о методе доступа к свойствам, заставляет меня думать, что это, скорее всего, связано.

0 голосов
/ 14 ноября 2011

Вы не можете достичь singleton с наследованием.У вас должно быть статическое поле composite, чтобы заставить singleton работать.

Когда вы вызываете конструктор, вы фактически создаете новый экземпляр MyList и имеете поле static * 1008.*.

В соответствии с рекомендациями, касающимися вашей проблемы, рекомендуется иметь Factory Method, который даст вам экземпляр вашего MyList с добавленным ароматом.

К тому, что вы ищетеfor - это реализация из 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...