我有一些这样的课程:
public class Customer
{ }
public interface IRepository
{ }
public class Repository<T> : IRepository
{ }
public class CustomerRepository<Customer>
{ }
然后,根据the answer to this question,我可以使用反射来获取每个*存储库的泛型引用的类型列表:
我最终想要的是Dictionary<Type, IRepository>
到目前为止,我有这个:
Dictionary<Type, IRepository> myRepositories = Assembly.GetAssembly(typeof(Repository<>))
.GetTypes()
.Where(typeof(IImporter).IsAssignableFrom)
.Where(x => x.BaseType != null && x.BaseType.GetGenericArguments().FirstOrDefault() != null)
.Select(
x =>
new { Key = x.BaseType != null ? x.BaseType.GetGenericArguments().FirstOrDefault() : null, Type = (IRepository)x })
.ToDictionary(x => x.Key, x => x.Type);
然而,它并不喜欢我的演员(IRepository)x
我收到以下错误:
无法转换类型为&System; Run.RuntimeType&#39;的对象输入&#39; My.Namespace.IRepository&#39;。
答案 0 :(得分:8)
您无法转换(IRepository) type
类型为Type
类,
您可以使用Activator.CreateInstance
创建对象CustomerRepository
,您也不需要使用Select
,而是直接使用ToDictionary
,代码如下:
var myRepositories = Assembly.GetAssembly(typeof(Repository<>))
.GetTypes()
.Where(x => x.BaseType != null &&
x.BaseType.GetGenericArguments().FirstOrDefault() != null)
.ToDictionary(x => x.BaseType.GetGenericArguments().FirstOrDefault(),
x => Activator.CreateInstance(x) as IRepository );
答案 1 :(得分:2)
如果x
是System.Type
个对象,就像x
是typeof(Repository<>)
一样,那么就不能像这样投出它。 Type
不是实例化。
如果x
没有“免费”类型参数,那就是x
非通用或已关闭通用,那么(IRepository)Activator.CreateInstance(x)
可能会创建一个x
类型的对象。但我不确定这是你需要的。是否会有无参数的实例构造函数?