C# 泛型边界

C# generic bounds

我有一个抽象的dto class,我想写一个批处理class来处理派生的dto:

dto:

public abstract class Command
    {
        private string TraceNo { get; set; }

        public override string ToString()
        {
            return ObjectDumper.Dump(this);
        }
    }

派生 dto:

 public class UserLoginDirectlyCommand : Command
    {
        public List<string>? LoginUserId { get; set; }
        public int ReserveCount { get; set; }
    }

接口:

public interface ICommandHandler<in T> where T : Command
{
    void Handler(T command, byte[] attachment);
}

具体处理程序:

public class LoginDirectlyCommandHandler : ICommandHandler<UserLoginDirectlyCommand>
{
    public void Handler(UserLoginDirectlyCommand command, byte[] attachment)
    {
    }
}

我想得到一个字典,键是命令 id,值是具体的处理程序:

public static Dictionary<int, T> GetCommandHandler<T, TC>() where TC : Command where T : ICommandHandler<TC>
    {
       List<ICommandHandler<Command>> list;
       var dic = new Dictionary<int, T>();
       dic[2] = new LoginDirectlyCommandHandler();

       return dic;
    }

但是语句dic[2] = new LoginDirectlyCommandHandler();无法编译:Cannot convert source type 'LoginDirectlyCommandHandler' to target type 'T'

谁能告诉我如何通过编译?谢谢!

好的...现在我们有了这个方法:

 public static Dictionary<int, T> GetCommandHandler<T, TC>() where TC : Command where T : ICommandHandler<TC>
    {
        List<ICommandHandler<Command>> list;
        var dic = new Dictionary<int, T>();
        dic[2] = new LoginDirectlyCommandHandler();

        return dic;
    }

如何调用该方法?

像这样?

GetCommandHandler<Something that extends ICommandHandler, something that extends Command>()...

所以现在当字典被实例化时,它将用 具体 类型实例化它。

因此,当您对 LoginDirectlyCommandHandler 进行赋值时,它不能保证提供的具体类型与发生的赋值兼容。您提供的具体类型可以是任何类型(只要它们分别是 Command 和 ICommandHandler 的子类)。因此,无法保证这些类型与您分配的 LoginDirectlyCommandHandler 兼容。