В основном я получил эти примеры классов:Cast неизвестного объекта общего интерфейс интерфейса (от первоначально явного общего типа универсального типа коллекции типа)
public interface IHasParts<TCollectionType> : where TCollectionType : ICollection
{
TCollectionType Parts { get; set; }
}
public class CarPart
{
//...
}
public class Car : IHasParts<List<CarPart>>
{
public List<CarPart> Parts { get; set; }
//...
}
Да, мне нужно использовать общий интерфейс ICollection
здесь , потому что для классов, реализующих IHasParts, нужны разные типы списков Parts
, основанные на некоторых жестких запрограммированных условиях.
Теперь я получаю неизвестный объект т.е. Car
и мне нужно, чтобы бросить его до самого высокого родителя, который все еще имеет свойство Parts
в наличии:
Car c = new Car() {
Parts = new List<CarPart>() {
// ...
}
};
object o = (object)c;
int partsCount = ((IHasParts<ICollection>)o).Parts.Count; // InvalidCastException
Как я могу сделать это? DotNetFiddle
Затем я могу полностью удалить общий тип 'IHasParts' и определить' Parts' сильного типа интерфейса 'ICollection'. Конечно, это может быть решение, все должно использовать 'ICollection'. Некоторые классы, которые реализуют «IHasParts», просто используют разные типы инициализированных списков, такие как «ObservableCollection <>». Если я инициализирую 'Parts' типа' ICollection' с объектом 'ObservableCollection', то подстрочные события этой коллекции все равно должны срабатывать, не так ли? – modiX
@modiX, да, они будут. И я лично думаю, что устранение дженериков все вместе было бы лучшим решением в вашем случае. –