Casting List <object> do listy <T> w czasie wykonywania
Usiłuję zbudować kontener DI i natknąłem się na następujący problem: Mam metodę, która pobiera listę zarejestrowanych instancji dla danego typu i chcę go użyć do wstrzyknięciaIEnumerable<T>
właściwości w danym obiekcie. Przykładem tego, co próbuję osiągnąć, byłoby:
class A { public IList<IExample> Objects { get; set; } }
class B: IExample {}
class C: IExample {}
Container.Register<IExample>(new B());
Container.Register<IExample>(new C());
var obj = new A();
Container.Inject(A);
Debug.Assert(A.Objects != null && A.Objects.Count == 2);
MójRetrieve
metoda zwracaIList<object>
, głównie dlatego, że w tej chwili nie mam informacji o typie, więc próbuję przekonwertować tę listę naList<T>
w czasie wtrysku. Oto forma sukcesu metod wykonujących pracę:
public virtual IList<object> Retrieve(Type type)
{
var instances = Registry[type];
foreach(var instance in instances)
Inject(type, instance); // omitted
return instances;
}
public virtual void Inject<T>(T instance)
{
var properties = typeof (T).GetProperties();
foreach (var propertyInfo in properties)
{
var propertyType = propertyInfo.PropertyType;
if (!IsIEnumerable(propertyType)) continue;
var genericType = propertyType.GetGenericArguments()[0];
propertyInfo.SetValue(instance,
GetListType(genericType, Retrieve(genericType)), null);
}
}
protected virtual object GetListType(Type type, IEnumerable<object> items)
{
return items.Select(item => Convert.ChangeType(item, type)).ToList();
}
Kod zwraca błąd:System.InvalidCastException : Object must implement IConvertible.
Niestety nie wiem, jak stąd postępować. Być może źle to robię. Myślałem o użyciu generycznych lub ręcznym wstrzykiwaniu wielu właściwości, ale naprawdę chciałbym tego nie robić.
Z góry dziękuję za wszelką pomoc lub pomysły.