2012-06-30 10 views
0

У меня есть следующие определения:Как я могу создать список, основанный на конкретном типе объекта?

public class BaseEntity 
{ 
    ... 
    public BaseEntity() 
    { 

    } 
} 

public class KeyValuePair 
{ 
    public string key; 
    public string value; 
    public string meta; 
} 

public class KeyValuePairList : BaseEntity 
{ 
    public List<KeyValuePair> List {set; get;} 

    public KeyValuePairList(IEnumerable<KeyValuePair> list) 
    { 
     this.List = new List<KeyValuePair>(); 
     foreach (KeyValuePair k in list) { 
      this.List.Add(k); 
     } 
    } 
} 

У меня есть еще 10 различных классов, как KeyValuePair и KeyValuePairList все достижения той же цели - бывший определяет объект, последний определяет перечень, в котором эти объекты должны быть размещены. Как я могу включить эту функциональность в базовый класс BaseEntity, так что мне не нужно переопределять логику экземпляра List в каждом отдельном классе, то есть я хочу иметь возможность создавать экземпляр списка на основе типа объекта, передаваемого конструктору? Какие-либо предложения?

+0

У вас есть второй класс 'BaseEntity', определенный в классе' BaseEntity'? Я не думаю, что это возможно. ** РЕДАКТИРОВАТЬ ** Я думаю, вы хотели, чтобы это был конструктор, не так ли? –

+1

@Kevin: Я предполагаю, что это опечатка, опустите класс и вы получите конструктор. –

+0

@ Кевин: Да. Сожалею! Я набрал более простой пример, глядя на мою среду IDE. Отредактировал вопрос сейчас. – Legend

ответ

4

Можете ли вы использовать дженерики?

public class BaseEntity<T> where T: class 
{ 
    public List<T> List { set; get; } 

    public BaseEntity(IEnumerable<T> list) 
    { 
     this.List = new List<T>(); 
     foreach (T k in list) 
     { 
      this.List.Add(k); 
     } 
    } 
} 

public class KeyValuePair 
{ 
    public string key; 
    public string value; 
    public string meta; 
} 

public class KeyValuePairList : BaseEntity<KeyValuePair> 
{ 
    public KeyValuePairList(IEnumerable<KeyValuePair> list) 
     : base(list) { } 
} 
+1

[FGITW] (http://meta.stackexchange.com/q/18014/183013). Ты победил. +1 –

+0

+1 Удивительный. Спасибо. Когда я нашел это, я продвигался к этому подходу: http://stackoverflow.com/questions/12051/calling-base-constructor-in-c-sharp, и теперь у меня есть и ваш ответ. Спасибо за ваше время. – Legend

Смежные вопросы