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 兼容。
我有一个抽象的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 兼容。