我的C#程序中有一堆类包含一个静态成员,它是该类所有实例的字典集合 - 如下所示:
class A
{
private static Dictionary<int,A> dict = new Dictionary<int, A>();
public static A GetInstance(int handle) { return dict[handle];}
public A(int handle) {this._handle = handle; dict[handle] = this;}
~A() { dict.Remove(_handle);}
private int _handle;
}
我在许多类中都有这个重复,并且想要分解这个常用代码,但是无法弄清楚这是怎么做的。将它放入普通的基类是行不通的,因为我想为每个具体类创建一个新的集合。我觉得必须有一种方法可以用泛型来做,但我现在还不太明白。
例如,这不对:
abstract class Base<T>
{
private static Dictionary<int,T> dict = new Dictionary<int, T>();
public static T GetInstance(int handle) { return dict[handle];}
public A(int handle) {this._handle = handle; dict[handle] = this;}
~Base() { dict.Remove(_handle);}
private int _handle;
}
class A : Base<A>
{
}
由于A的构造函数不正确,它无法编译。我在这里错过了一招吗?
答案 0 :(得分:2)
这是我使用IDisposable
interface实施的变体:
class Base<T> : IDisposable
where T : Base<T>, new()
{
private static Dictionary<int, T> dict = new Dictionary<int, T>();
private static T Get(int handle)
{
if (!dict.ContainsKey(handle))
dict[handle] = new T(); //or throw an exception
return dict[handle];
}
private static bool Remove(int handle)
{
return dict.Remove(handle);
}
public static T GetInstance(int handle)
{
T t = Base<T>.Get(handle);
t._handle = handle;
return t;
}
protected int _handle;
protected Base() { }
public void Dispose()
{
Base<T>.Remove(this._handle);
}
}
class A : Base<A> { }
然后使用它:
using (A a = Base<A>.GetInstance(1))
{
}
这里没有public
构造函数用于从Base<T>
派生的任何类。虽然应使用静态工厂GetInstance
方法来创建实例。请记住,仅在调用Dispose
方法时才会从字典中删除实例,因此您应该使用using
statement或手动调用Dispose
。
但是我猜你还是应该考虑一下SLaks的评论。