将当前对象引用为泛型类型的关键字

本文关键字:泛型类型 关键字 对象引用 | 更新日期: 2023-09-27 18:09:31

我有一个简单的通用委托:

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);
    }
}

虽然这确实有效,但我没有办法强制传递给Execute的TCommand是当前对象的类型(更派生的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);
}

注意"This"上的大写T。我绝不是一个语言设计师,但我很好奇我是不是出去吃午饭了。这是CLR可以处理的事情吗?

也许已经有解决问题的模式了?

将当前对象引用为泛型类型的关键字

不存在thistype约束。这里有Eric Lippert关于这个话题的一些思考:好奇和好奇。

特别注意,CRTP(问题的"解决方案")实际上并不是一个解决方案。

不,c#中没有这样的东西。如果你想这样做,你将不得不使用你的自引用泛型类定义。