我有一个简单的通用委托:
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可以处理的吗?
也许已有解决问题的模式?
答案 0 :(得分:2)
不,没有thistype
约束。 Eric Lippert在这个主题上有一些想法:Curiouser and curiouser。
请注意,特别是CRTP(问题的“解决方案”)实际上并不是解决方案。
答案 1 :(得分:0)
不,C#中没有类似的东西。如果你想要这样做,你将不得不使用你的自引用泛型类定义。