开发者

A keyword to reference the current object as a generic type

开发者 https://www.devze.com 2023-04-08 02:11 出处:网络
I have a simple generic delegate: delegate void CommandFinishedCallback<TCommand>(TCommand command)

I have a simple generic delegate:

delegate void CommandFinishedCallback<TCommand>(TCommand command) 
    where TCommand : CommandBase;

I use it in the following abstract class:

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

While this does work, I have no way of forcing the TCommand passed into Execute to be the type of the current object (the more derived CommandBase).

I've seen this solved by doing:

public abstract class CommandBase<TCommand>
    where TCommand : CommandBase<TCommand>
{ 
    // class goes here
}

But I'm wondering why there isn't a C# keyword for accomplishing that? What I'd love to see is something like the following:

public void ExecuteAsync<TCommand>(CommandFinishedCallback<TCommand> callback)
    where TCommand : This
{
    // Async stuff happens here

    callback.Invoke(this);
}

Note the capital T on "This". I'm by no means a language designer, but I'm curious if I'm out t开发者_C百科o lunch or not. Would this be something the CLR could handle?

Maybe there's already a pattern for solving the problem?


No, there is no thistype constraint. There are some musings on this topic by Eric Lippert here: Curiouser and curiouser.

Note, in particular, the CRTP (your "solution" to the problem) isn't actually a solution.


No, there is nothing like that in C#. You're going to have to go with your self-referencing generic class definition if you want to do this at all.

0

精彩评论

暂无评论...
验证码 换一张
取 消