2014-01-23 3 views
1

У меня есть класс ContextBase так:Список общих объектов

public class ContextBase<T, TK> where T : IIdAble<TK>, new() 
{ 

} 

А класс, содержащий несколько ContextBases:

public static class Context 
{ 
    private static ContextBase<Action, int> _actionContext; 
    private static ContextBase<Customer, long> _customerContext; 
} 

Теперь я могу поставить эти два ContextBases в одном списке? мне нужно что-то вроде этого в контексте:

private static List<ContextBase<T,K>> _contexts; 

Я мог бы просто использовать ArrayList, но это возможно с обобщениями?

ответ

1

Вы не сможете сделать это безопасно. Однако вам не нужно доходить до небезопасности ArrayList.

public class ContextBase<T, TK> : IContextBase where T : IIdAble<TK>, new() 
           ^  ^

Сделать необщего интерфейс с что ContextBase инвентарь, а затем использовать List<IContextBase>.

К сожалению, вы по-прежнему не сможете использовать общие члены ContextBase, но это минимальная цена, которую вы должны будете заплатить.

+0

Я добавил IContextBase. Работает отлично. Спасибо за образец кода, синтаксис с двумя «:» был немного запутанным. – Carra

1

Нет, это невозможно. Это похоже на вопрос, можете ли вы хранить строки и ints в чем-то более конкретном, чем List<object>.

Поскольку object является единственным общим базовым классом ContextBase<Action, int> и ContextBase<Customer, long>, вы можете использовать только List<object> для хранения как в одном списке.

Вы можете, однако, заставить их реализовать общий (не общий) интерфейс IContextBase, который содержит все функции, необходимые для выполнения в этих элементах списка, и имеет ContextBase<T, TK> реализовать IContextBase. Затем вы можете использовать List<IContextBase>.

+0

Спасибо, это фиксирует его. – Carra

1

потому что ContextBase определяются как ContextBase<T, TK> where T : IIdAble<TK> это означает, что компилятор увидит ContextBase<Action, int> и ContextBase<Customer, long>, как Seperate классов просить List<ContextBase<T,K>> почти эквивалент просить Список междунар, долго он нарушает намерение общего списка. Вместо этого вы можете иметь список классов, которые имеют как ContextBase<Action, int>, так и ContextBase<Customer, long>.

public class ContextBase<T, TK> : CommonClass where T : IIdAble<TK>, new(){...} 

, а затем

private static List<CommonClass> _contexts = new List<CommonClass>{ 
    new ContextBase<Action, int>(), 
    new ContextBase<Customer, long>() 
}; 
Смежные вопросы