3 Stimmen

Ein Schlüsselwort, um auf das aktuelle Objekt als generischen Typ zu verweisen

Ich habe einen einfachen generischen Delegierten:

delegate void CommandFinishedCallback<TCommand>(TCommand command) 
    where TCommand : CommandBase;

Ich verwende sie in der folgenden abstrakten Klasse:

public abstract class CommandBase
{
    public CommandBase()
    { }

    public void ExecuteAsync<TCommand>(CommandFinishedCallback<TCommand> callback)
        where TCommand : CommandBase
    {
        // Async stuff happens here

        callback.Invoke(this as TCommand);
    }
}

Dies funktioniert zwar, aber ich habe keine Möglichkeit, den TCommand zu erzwingen, der an Execute übergeben wird, um den Typ des aktuellen Objekts zu sein (die mehr abgeleitete CommandBase).

Ich habe gesehen, wie man das lösen kann:

public abstract class CommandBase<TCommand>
    where TCommand : CommandBase<TCommand>
{ 
    // class goes here
}

Aber ich frage mich, warum es nicht ein C#-Schlüsselwort für diese Aufgabe gibt? Was ich gerne sehen würde, ist etwas wie das folgende:

public void ExecuteAsync<TCommand>(CommandFinishedCallback<TCommand> callback)
    where TCommand : This
{
    // Async stuff happens here

    callback.Invoke(this);
}

Beachten Sie das große T bei "Dies". Ich bin beileibe kein Sprachdesigner, aber ich bin neugierig, ob ich auf dem Holzweg bin oder nicht. Wäre dies etwas, das die CLR verarbeiten könnte?

Vielleicht gibt es bereits ein Muster für die Lösung des Problems?

2voto

jason Punkte 227577

Nein, es gibt keine thistype Einschränkung. Einige Überlegungen zu diesem Thema von Eric Lippert finden sich hier: Neugierig und neugierig .

Beachten Sie insbesondere die CRTP (Ihre "Lösung" des Problems) ist nicht wirklich eine Lösung.

0voto

Kirk Woll Punkte 72923

Nein, so etwas gibt es in C# nicht. Sie werden mit Ihrer selbstreferenzierenden generischen Klassendefinition arbeiten müssen, wenn Sie dies überhaupt tun wollen.

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