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

时间:2011-09-25 16:08:17

标签: c# generics c#-4.0

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

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可以处理的吗?

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

2 个答案:

答案 0 :(得分:2)

不,没有thistype约束。 Eric Lippert在这个主题上有一些想法:Curiouser and curiouser

请注意,特别是CRTP(问题的“解决方案”)实际上并不是解决方案。

答案 1 :(得分:0)

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