9

我有一些这样的课程:

public class Customer
{ }

public interface IRepository 
{ }

public class Repository<T> : IRepository
{ }

public class CustomerRepository<Customer>
{ }

然后,根据这个问题的答案,我可以使用反射来获取我的每个 *Repository 的泛型引用的类型列表:

我想要结束的是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.RuntimeType”类型的对象转换为“My.Namespace.IRepository”类型。

4

2 回答 2

13

您不能(IRepository) type使用 type is Typeclass 进行强制转换,

可以使用Activator.CreateInstance创建对象CustomerRepository,也不需要使用SelectToDictionary直接使用,代码如下:

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 );
于 2012-09-17T18:21:09.540 回答
3

Ifx是一个System.Type对象,就像 if xis一样typeof(Repository<>),你不能像那样投射它。Type不是实例化。

如果x没有“自由”类型参数,即x非泛型或封闭泛型,那么(IRepository)Activator.CreateInstance(x)可能会为您创建一个类型为 的对象x。但我不确定这就是你需要的。会有无参数的实例构造函数吗?

于 2012-09-17T18:21:16.907 回答