2013-11-22 2 views
0

Im работая с EntitFramework, который генерирует свои Entity классы:C#: ICollection с интерфейсом как тип, как ICollection <ILocalized>

У меня есть эти классы:

public class Car 
{ 
    //... 
    public String Brand { get; set; } 
    //... 

    public virtual ICollection<CarLocalized> CarLocalizeds { get; set; } 
    //... 
} 

public class CarLocalized :ILocalized 
{ 
    public int LangID { get; set; } 

    public Lang Lang { get; set; } 
} 

public static class Helper { 
    public static List<String> GetLangIDList(ICollection<ILocalized> list) 
    { 
     //I want all the ID of the lang where car is translated for: 
     var somethin = list.Select(m => m.LCID_SpracheID.ToString()).ToList(); 
     return somethin; 
    } 
} 

public class HomeController : Controller 
{ 
    public ActionResult Translated() 
    { 
     Car car = db.Cars.Find(2); 
     List<String> transletedIDs = Helper.GetLangIDList(car.CarLocalizeds); 

     return View(transletedIDs); 
    } 

} 

, но теперь проблема в том, что

List<String> transletedIDs = Helper.GetLangIDList(car.CarLocalizeds); 

не работает. Почему я не могу установить подпись на ICollection и дать ей ICollection, где CarLocalized реализует интерфейс, который требуется в Signature?

Пожалуйста, помогите мне ...

THx

ответ

1

Проблема ICollection<T> не "Ковариантное". Кажется GetLangIDList метод не изменяет список, он просто запрашивает список. В этом случае вы можете использовать IEnumerable<T>, который является «ковариант».

public static List<String> GetLangIDList(IEnumerable<ILocalized> list) 
{ 
    //I want all the ID of the lang where car is translated for: 
    var somethin = list.Select(m => m.LCID_SpracheID.ToString()).ToList(); 
    return somethin; 
} 

Подробнее о Covariance and Contravariance in Generics и Faq

+0

отлично! большое спасибо! – scarnapper