将通用类型转换为接口类型-无法将类型'System.RuntimeType'的对象转换为类型
收藏

我上过这样的课:

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.runtimetype”类型的对象强制转换为“my.namespace.irepository”类型。


最佳答案:

类型为(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 );

    公众号
    关注公众号订阅更多技术干货!