Witam,
Dziś spotkałem się z pewnym kłopotem i chciałbym zapytać Was jak Wy byście to rozwiązali.
Załóżmy, że mamy klasę
public abstract class BaseDefinition
{
public int Id {get;set;}
public string Name {get;set;}
}
oraz klasę generyczną
public abstract class BaseObject
{
public string Name {get;set;}
public string Schema {get;set;}
}
public abstrac class BaseObject<T> : BaseObject where T : BaseDefinition
{
public IList<T> Objects {get;set;}
}
oraz klasy dziedziczące z nich
public class ClassADefintion : BaseDefinition
{
public bool IsChanged {get;set;}
}
public class ClassAObject : BaseObject<ClassADefinition>
{
public bool OtherField {get;set;}
}
public class ClassBDefintion : BaseDefinition
{
public bool IsBBBChanged {get;set;}
}
public class ClassBObject : BaseObject<ClassBDefinition>
{
public bool OtherBBBBField {get;set;}
}
Sorki za nazwy klas - ale to nie ma znaczenia w tym przypadku. Jak widać na razie jest wszystko w porządku.
teraz powiedzmy, że mamy 2 obiekty IEnumerable
IEnumerable<ClassBObject> ClassBObjectCollection;
IEnumerable<ClassAObject> ClassAObjectCollection;
i potrzebuję stworzyć metodę, która przyjmie obie te kolekcje, co oczywiście zrobiłem to
public void DoWork(IEnumerable<BaseObject<BaseDefinition>> objects)
{
foreach(var obj in objects)
{
foreach(var obj1 in obj.Objects)
{
// znów sory za nazwy, ale to tylko przykład, chodzi o ukazanie tego, że muszę iterować po obj.Objects
}
}
//crash
}
W tym momencie kłopot, dupa blada zbita :P Lekki zamęt w głowie i przypomniałem sobie, że dla generycznych klasy
BaseObject<BaseDefinition> != ClassAObject, mimo że kompilator przepuści taki schemat. Przypomniałem sobie również, że w .NET 4 doszła opcja out w interface dla takich sytuacji, no to co, piszemy interface
public interface IBaseObject<out T> where T : BaseDefinition
{
IList<T> Objects {get;set;}
}
nawet nie uda się w klasie abstrakcyjnej BaseObject zaimplementować IBaseObject, gdyż nie można stworzyć IList z out T
Ma ktoś jakieś pomysły na taką sytuację ?
Pozdrawiam