Ho alcune classi come questo:Casting generico per tipo di interfaccia - Impossibile eseguire il cast oggetto di tipo 'System.RuntimeType' di digitare
public class Customer
{ }
public interface IRepository
{ }
public class Repository<T> : IRepository
{ }
public class CustomerRepository<Customer>
{ }
Poi, come da the answer to this question posso utilizzare la reflection per ottenere un elenco di i tipi a cui fa riferimento generici per ciascuno dei miei * Repository:
Quello che voglio è finire con un Dictionary<Type, IRepository>
Finora, ho questo:
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);
Tuttavia, non gli piace il mio cast (IRepository)x
ottengo il seguente errore:
Unable to cast object of type 'System.RuntimeType' to type 'My.Namespace.IRepository'.
Come stai * aspettandosi * di ottenere un'istanza quando hai solo un 'Tipo'? –