2 Stimmen

Übergabe eines 'Typs' an einen generischen Konstruktor

Nachmittag, Abend... was immer es ist, wo du bist ;)

Ich arbeite an einem 'ThreadManager', der eine Reihe von 'ManagedThread<>'s ausführt. Ein verwalteter Thread ist ein generischer Wrapper für einen "ManagableThread", der die meisten der wesentlichen Methoden enthält.

Die Liste der zu startenden "ManagableThreads" basiert auf den Angaben in einer Konfigurationsdatei und wird in der Methode ThreadManager.Start erstellt. Diese Liste soll mit allen 'ManagedThreads' gefüllt werden, die... verwaltet werden sollen. Hier ist der Code, mit dem ich versuche, diese Aufgabe zu bewältigen, und ich bin sicher, dass jeder kompetente C#-Entwickler schnell erkennen wird, dass ich es so nicht hinbekomme.

public void Start() {
    foreach (String ThreadName in this.Config.Arguments.Keys) {
        Type ThreadType = null;

        if ((ThreadType = Type.GetType(ThreadName)) == null) {
            continue;
        }
        else {
            ManagedThread<ThreadType> T = new ManagedThread<ThreadType>(
                this,
                this.GetConfiguration(ThreadType)
            );
            this.ManagedThreads.Add(T);

            continue;
        }
    }
}

Ich habe ein paar Versuche unternommen, aber ohne Erfolg. Wenn jemand irgendwelche Vorschläge hat, wäre ich dankbar dafür. Ich bin kein Generics-Experte, so dass dies etwas außerhalb meines Fachgebiets ist, also bitte unterlassen Sie es, mich zum Weinen zu bringen, aber fühlen Sie sich frei, mich zu fangen, wenn ich ein Narr bin.

Vielen Dank im Voraus an alle, die mir helfen können.

Edit: Ich nehme an, ich sollte mein Problem klären, anstatt Sie alle es herausfinden zu lassen... Dieser Code lässt sich nicht kompilieren, da ich "ThreadType" nicht an den generischen Parameter für meinen Konstruktor übergeben kann.

7voto

SLaks Punkte 832502

Das macht keinen Sinn.
Generika sind Kompilierzeit Typen; Sie können keinen Kompilierzeittyp haben, der erst zur Laufzeit bekannt ist.

Stattdessen müssen Sie Reflection verwenden:

Type gt = typeof(ManagedThread<>).MakeGenericType(ThreadType);
object t = Activator.CreateInstance(gt, this,this.GetConfiguration(ThreadType));

0voto

Davy8 Punkte 30108

Das ist nicht möglich. Generische Parameter müssen zur Kompilierzeit bekannt sein. Ihr Typ ist bis zur Laufzeit nicht bekannt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X