2012-06-08 6 views
2

Это похоже на другую тему я недавно опубликовал, но, возможно, это может быть проще и понятнее:C# вентиляционный общий тип интерфейс

Я хочу, чтобы выполнить следующие действия (или что-то очень похожее) ...

IManageableEntryDao<IManageableEntry> dao = new CompanyNameDao(); 

... со следующими классами:

public interface IManageableEntry { 
    string Name { get; set; } 
} 

public class CompanyName : IManageableEntry { 
    public string Name { get; set; } 
} 

public interface IManageableEntryDao<T> where T : IManageableEntry { 
} 

public class CompanyNameDao : IManageableEntryDao<CompanyName> { 
} 

Если я пытаюсь сделать бросок as IManageableEntryDao<IManageableEntry>, я получаю нуль.

+0

Значит, это не выполнимо в C# 3.5? –

+0

К сожалению, нет. По крайней мере, не напрямую. Вам нужно будет найти обходное решение, например. создание 'CompanyNameDao' наследуется от' IManageableEntryDao '; это ваш звонок. – univerio

+0

Правильно, это менее элегантно, потому что CompanyNameDao возвращает объекты IManageableEntry, а не объекты CompanyName. –

ответ

2

См. Variance in Generic Interfaces. Измените интерфейс на IManageableEntryDao<out T>, и он должен работать (если интерфейс не использует его таким образом, чтобы это недействительно).

4

Я считаю, что вам нужно covariance, чтобы это сработало. Эта функция доступна только в C# 4.0. Что вам нужно сделать:

public interface IManageableEntryDao<out T> where T : IManageableEntry { } 
Смежные вопросы