Casting-generic - Schnittstelle Unable to cast object of type 'System.RuntimeType' zu geben
Ich habe einige Klassen, wie diese:
public class Customer
{ }
public interface IRepository
{ }
public class Repository<T> : IRepository
{ }
public class CustomerRepository<Customer>
{ }
Dann, als pro die Antwort auf diese Frage ich kann reflektion verwenden, um eine Liste der Typen, auf die verwiesen wird von Generika für jedes meiner *Repository:
Was ich will, um am Ende mit ist eine Dictionary<Type, IRepository>
Bisher habe ich dieses:
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);
Jedoch, Sie mag es nicht, meine Besetzung (IRepository)x
Ich bekomme die folgende Fehlermeldung:
Unable to cast object of type 'System.RuntimeType' zu geben 'Meine.Namespace.IRepository'.
- Wie erwarten Sie, dass es sich um eine Instanz zu erhalten, wenn Sie habe nur eine
Type
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht gegossen
(IRepository) type
mit TypType
Klasse,können Sie
Activator.CreateInstance
erstellen des ObjektsCustomerRepository
Sie brauchen auch nicht zu verwendenSelect
, verwenden Sie stattdessenToDictionary
direkt den code unten:Wenn
x
ist einSystem.Type
Objekt, wie wennx
isttypeof(Repository<>)
können Sie nicht nur wirken, wie das. DieType
ist nicht eine Instanziierung.Wenn
x
hatte keine "freien" geben Sie Parameter, wennx
wo nicht-generischen oder geschlossen generischen, dann(IRepository)Activator.CreateInstance(x)
erstellen Sie ein Objekt vom Typx
. Aber ich bin mir nicht sicher, dass das, was Sie brauchen. Wird es einen parameterlosen Instanz-Konstruktor?