2015-10-25 3 views
2

Пытается задуматься над генериками, и я хочу создать класс, который возвращает записи разных типов.Использование генериков для возврата Список различных типов

Так что я хочу что-то вроде этого:

public class Job 
{ 
    public JobType Type { get; set; } 

    public Job (JobType jobType) 
    { 
     Type = jobType; 
    } 

    public IList<T> GetRecords<T>() 
    { 
     IList<T> records = new IList<T>(); 

     if (Type == JobType.Type1) 
     { 
      List<Type1Record> records = GetType1Records(); 
     } 
     if (Type == JobType.Type2) 
     { 
      List<Type2Record> records = GetType2Records(); 
     } 
     return records; 
    } 
} 

Я хотел бы назвать это, используя что-то вроде

var job = new Job(JobType.Type1); 

var jobRecords = Job.GetRecords(); 

Я думаю, что код выше передает намерение, но я начинаю думать, что я делаю это неправильно, потому что выше всего не работает вообще. IList нельзя преобразовать в другие типы, подобные этому.

Кто-нибудь знает, как я могу достичь чего-то подобного.

+1

Полиморфизм. Функция должна возвращать 'IEnumerable '. –

ответ

1

Вам, кажется, не хватает точки дженериков. Если вы пытаетесь разобраться с несколькими конкретными типами в общем методе, это обычно означает, что вы идете в неправильном направлении.

Одним из возможных решений вашей проблемы, чтобы ваш Records наследовать от некоторого общего базового класса:

public class Job 
{ 
    public JobType Type { get; set; } 

    public Job (JobType jobType) 
    { 
     Type = jobType; 
    } 

    // Type1Record and Type2Record both inherit from RecordBase 
    public IEnumerable<RecordBase> GetRecords() 
    { 
     if (Type == JobType.Type1) 
     { 
      return GetType1Records(); 
     } 
     if (Type == JobType.Type2) 
     { 
      return GetType2Records(); 
     } 

     return null; 
    } 
} 

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

Похоже, что вам лучше использовать дженерики на уровне класса.

public abstract class Job<TRecord> 
{ 
    public abstract IList<TRecord> GetRecords(); 
} 

public class Type1Job : Job<Type1Record> 
{ 
    public override IList<Type1Record> GetRecords() 
    { 
     // implementation 
    } 
} 

public class Type2Job : Job<Type2Record> 
{ 
    public override IList<Type2Record> GetRecords() 
    { 
     // implementation 
    } 
}