Я думаю, что вы хотите:
// Cast to IEnumerable<MyBaseClass> isn't helping you, so why bother?
object cln = pi.GetValue(this, null);
// Create myBaseClassInstance.
// (How will you do this though, if you don't know the element-type?)
MyBaseClass myBaseClassInstance = ...
// Invoke Add method on 'cln', passing 'myBaseClassInstance' as the only argument.
pi.PropertyType.GetMethod("Add").Invoke(cln, new[] { myBaseClassInstance } );
Поскольку вы не знаете, каким будет тип элемента коллекции (может быть «Автомобиль», «Велосипед», «Цикл» и т. Д.), Вам будет сложно найти полезный состав. Например, хотя вы говорите, что коллекция будет определенно реализовывать IList<SomeMyBaseClassSubType>
, это не так уж и полезно, поскольку IList<T>
не является ковариантным. Конечно, приведение к IEnumerable<MyBaseClass>
должно успешно, но это не поможет, поскольку не поддерживает мутации. С другой стороны, если в вашем типе коллекции реализованы неуниверсальные типы IList
или ICollection
, приведение к ним может оказаться полезным.
Но если вы уверены , что коллекция будет реализовывать IList<Car>
(т.е. вы заранее знаете тип элемента коллекции), все будет проще:
// A much more useful cast.
IList<Car> cln = (IList<Car>)pi.GetValue(this, null);
// Create car.
Car car = ...
// The cast helped!
cln.Add(car);