У меня есть простой универсальный делегат:
delegate void CommandFinishedCallback<TCommand>(TCommand command)
where TCommand : CommandBase;
Я использую его в следующем абстрактном классе:
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);
}
}
Хотя это работает, у меня нет способа заставить TCommandпередан в Execute, чтобы быть типом текущего объекта (более производная CommandBase).
Я видел, как это решается с помощью:
public abstract class CommandBase<TCommand>
where TCommand : CommandBase<TCommand>
{
// class goes here
}
Но мне интересно, почему нетэто ключевое слово C # для достижения этой цели?Я бы хотел увидеть что-то вроде следующего:
public void ExecuteAsync<TCommand>(CommandFinishedCallback<TCommand> callback)
where TCommand : This
{
// Async stuff happens here
callback.Invoke(this);
}
Обратите внимание на заглавную букву T на "This".Я ни в коем случае не дизайнер языков, но мне любопытно, обедаю я или нет.Может ли это быть тем, с чем справится CLR?
Может быть, уже есть шаблон для решения проблемы?