在运行时将List 转换为List

我正在尝试构建一个DI容器,我偶然发现了以下问题:我有一个方法可以检索给定类型的已注册实例列表,我想用它来注入IEnumerable属性。给定的对象。 我想要实现的一个例子如下:

 class A { public IList Objects { get; set; } } class B: IExample {} class C: IExample {} Container.Register(new B()); Container.Register(new C()); var obj = new A(); Container.Inject(A); Debug.Assert(A.Objects != null && A.Objects.Count == 2); 

My Retrieve方法返回一个IList ,主要是因为那时我没有类型信息,所以我试图在注入时将该列表转换为List 。 这是执行工作的方法的一种简单forms:

 public virtual IList Retrieve(Type type) { var instances = Registry[type]; foreach(var instance in instances) Inject(type, instance); // omitted return instances; } public virtual void Inject(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 items) { return items.Select(item => Convert.ChangeType(item, type)).ToList(); } 

代码返回错误: System.InvalidCastException : Object must implement IConvertible. 可悲的是,我不知道如何从这里开始。 也许我这样做是错的。 我曾想过使用generics或手工注入多个属性,但我真的不想这样做。

提前感谢任何帮助或想法。

你可以像这样创建一个通用列表:

 public virtual IList Retrieve(Type type) { // ... listType = typeof(List<>).MakeGenericType(new Type[] { type }); IList list = (IList)Activator.CreateInstance(listType); // ... return list } 

这个列表可以转换为IList ,因为它是一个。

你可以考虑使用IEnumerableCast ,但是你没有列表的实例。 我不知道拥有一个是多么重要。