Was bedeutet dieser Teil ist möglich:
new AnimalContext();
Offensichtlich ist diese genaue Syntax falsch, und wir werden darauf eingehen, aber es ist möglich, eine Instanz eines generischen Typs zur Laufzeit zu erstellen, wenn Sie die Typparameter nicht bis zur Laufzeit kennen.
Was Sie mit diesem Teil meinen ist nicht:
AnimalContext a_Context
Es ist also unmöglich, eine Variable als generischen Typ zu deklarieren, wenn Sie die Typparameter zur Kompilierungszeit nicht kennen. Generika sind Kompilierungszeitkonstrukte und setzen voraus, dass die Typinformationen zur Kompilierungszeit verfügbar sind. Wenn Sie die Typen zur Kompilierungszeit nicht kennen, verlieren Sie alle Vorteile der Generika.
Um jedoch eine Instanz eines generischen Typs zur Laufzeit zu erstellen, wenn Sie den Typ bis zur Laufzeit nicht kennen, können Sie folgendes sagen:
var type = typeof(AnimalContext<>).MakeGenericType(a.GetType());
var a_Context = Activator.CreateInstance(type);
Beachten Sie, dass der Typ zur Kompilierungszeit von a_context
object
ist. Sie müssen a_context
in einen Typ oder ein Interface umwandeln, das die Methoden enthält, auf die Sie zugreifen möchten. Oft sieht man Leute hier den generischen Typ AnimalContext
implementieren ein Interface (sagen wir IAnimalContext
) oder von einer nicht generischen Basisklasse erben (sagen wir AnimalContext
), die die benötigten Methoden definiert (so können Sie a_context
in das Interface oder die nicht generische Basisklasse umwandeln). Eine andere Alternative ist die Verwendung von dynamic
. Aber denken Sie daran, dass Sie dadurch keinen der Vorteile von generischen Typen haben.