Общие классы с общими статическими полями в C # - PullRequest
0 голосов
/ 11 августа 2009

У меня есть общее определение класса, подобное этому:

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

Теперь я хотел бы, чтобы все экземпляры MyClass<TProperty,TOwner> независимо от типов TProperty или TOwner разделяли Hashtable. Я подумал о создании внутреннего MyClassBase с защищенным внутренним статическим полем типа Hashtable и наследования от него. Я действительно хочу, чтобы определение MyClass имело доступ к этой хеш-таблице.

Это разумный подход? Я не могу запечатать MyClassBase, так что это может привести к открытию банки с червями позже ...

Есть ли другие подходы для этого?

Ответы [ 2 ]

3 голосов
/ 11 августа 2009

Защищенный статический 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 голос
/ 11 августа 2009

Другой вариант - создать internal static class с открытым участником и получить к нему доступ только с MyClass<T,U>. Конечно, он будет виден внутри вашей сборки, но это легко контролировать по сравнению с элементом protected. Просто убедитесь, что он используется только в вашем MyClass<T,U>, и все будет хорошо.

...