Um eine Instanz einer generischen basiert auf einer Art zu machen, Sie Reflektion verwenden können, um eine Instanz der generischen mit dem Typ, den Sie verwenden möchten, bekommen, dann Activator verwenden diese Instanz zu erstellen:
Type t = typeof (string); //the type within our generic
//the type of the generic, without type arguments
Type listType = typeof (List<>);
//the type of the generic with the type arguments added
Type generictype = listType.MakeGenericType(t);
//creates an instance of the generic with the type arguments.
var x = Activator.CreateInstance(generictype);
Beachten Sie, dass x
hier eine object
sein wird. Um Funktionen aufzurufen, z. B. .Sort()
, müssen Sie eine dynamic
machen.
Bitte beachten Sie, dass dieser Code schwer zu lesen, zu schreiben, zu pflegen, zu begründen, zu verstehen oder zu lieben ist. Wenn Sie irgendwelche Alternativen zur Notwendigkeit haben, diese Art von Struktur zu verwenden, erforschen Sie diese gründlich.
bearbeiten: Sie können auch das Objekt werfen Sie aus dem Activator
, wie (IList)Activator.CreateInstance(genericType)
erhalten. Dadurch erhalten Sie einige Funktionen, ohne auf Dynamik zurückgreifen zu müssen.
Warum können Sie nicht 'SomeGenericMethod()' verwenden, wenn dies nicht Ihr Anwendungsfall ist, dann müssen Sie angeben, wie Sie es tatsächlich verwenden werden, da der beste Weg, es zu lösen, davon abhängt, wie Sie es tun. Angenommen, dass 'var' der Typ von' t' ist, dann ist das, was Sie wirklich wollen, 't result = ...' was ein ganz anderes Problem ist. –
@ScottChamberlain, das scheint wie ein Beispiel ... um des Beispiels willen. Cyan, bitte geben Sie an, ob es ist oder nicht. – Mafii
Ich bekomme den Typ als Parameter in einer Methode und dann möchte ich es an die generische Methode übergeben. Ja, es ist nur ein Beispiel. – Cyan