我按照这样构建了我的课程:
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放置单例类的最佳原因是什么?感谢
答案 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
其中SomeNamespace
是MyList
类的命名空间,或者它是根命名空间:
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.