2014-12-09 2 views
2

Я сделал интерфейс, какСписок Declare <IEntity<T>> где T: класс

public interface IEntity<T> where T:class 
{ 
    public Save(T entity); 
    public Update(T entity); 
    IEnumerable<T> GetAll(); 
    T GetById(int id); 
} 

Теперь у меня есть еще один класс, в котором я хочу, чтобы создать список этого типа IEntity.

public class myClass 
{ 
    public List<IEntity<T>> NewList = new List<IEntity<T>>(); // how to tell the compiler where T is class 
} 

, но эта ошибка дает мне говорят

The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?) 

даже возможно ли это?

ответ

5

Вам также потребуется спараметрировать myClass

public class myClass<T> where T : class 
{ 
    public List<IEntity<T>> NewList = new List<IEntity<T>>(); 
} 

Что теперь вы можете создать экземпляр:

var instance = new myClass<Foo>(); 

И обязательный к сведению, что это вообще не хорошая практика, чтобы выставить поля в качестве членов общественности:)

Удостоверьтесь, что в вашем интерфейсе есть проблемы:

public interface IEntity<T> where T:class 
{ 
    void Save(T entity); // Must have return type 
    void Update(T entity); // Drop the public 
    IEnumerable<T> GetAll(); 
    T GetById(int id); 
} 

Edit, Re Инкапсуляция

Например, вы могли бы инкапсулировать со свойством с частным сеттер (список инициализируется в конструкторе) - это, по крайней мере, остановить потребителей от переназначения списка.

public IList<IEntity<T>> NewList { get; private set; } 

public myClass() 
{ 
    NewList = new List<IEntity<T>>(); 
} 

А еще лучше, в зависимости от дизайна, вы можете скрыть List реализацию полностью, разоблачить IEnumerable<T> для потребителей, чтобы читать список и добавить явные методы для изменения внутренней коллекции.

+0

Thnx для «заметок». Я постараюсь следовать, как вы сказали. Но как я могу объявить открытый Список > NewList = новый Список >(); в myClass, если интерфейс не является общедоступным? –

+1

Я обновил пару идей. – StuartLC

+0

Могу ли я иметь myClass без параметра T ..? На самом деле я хотел создать ОДИН объект myClass и добавить любой тип T в NewList. В текущей ситуации при инициализации myClass я должен указать T, чего я хочу избежать –

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

  • Нет связанных вопросов^_^