C#中具有共享静态字段的通用类

时间:2009-08-10 20:22:45

标签: c# .net generics .net-3.5 static

我有一个与此类似的泛型类定义:

public sealed class MyClass<TProperty,TOwner>
{
    ...
}

现在我想要MyClass<TProperty,TOwner>的任何实例,无论TProperty或TOwner的类型如何共享Hashtable。我想过创建一个内部MyClassBase,它带有一个受保护的Hashtable类型的内部静态字段,并从中继承。我真的只希望MyClass的定义能够访问这个哈希表。

这是一种合理的方法吗?我无法密封MyClassBase,所以这可能会导致以后打开一堆蠕虫......

还有其他方法吗?

2 个答案:

答案 0 :(得分:3)

受保护的静态Hashtable是一种很好的方法(确保您同步它)。您不能拥有其派生类是公共的内部基类 - 但是您可以通过将其默认构造函数设置为内部来阻止它在程序集外部派生:

public abstract class MyBaseClass
{
    internal MyBaseClass() { }

    private static Hashtable _hashtable;

    protected static Hashtable Hashtable
    {
        get
        {
            if(_hashtable == null)
            {
                _hashtable = Hashtable.Synchronized(new Hashtable());
            }
            return _hashtable;
        }
    }
}

答案 1 :(得分:1)

另一种选择是使用公开的成员制作internal static class,并且只能从MyClass<T,U>访问它。当然,它在你的装配中是可见的,但与protected成员相比,这很容易控制。只需确保只在MyClass<T,U>中使用它就可以了。