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?