在Java中,我可以指定传递给像
这样的方法的类型的边界public <C extends Command, CH extends CommandHandler<C>> void
registerCommandHandler(Class<C> command, Class<CH> handler) {
System.out.println("command class is " + command.getCanonicalName());
Object instance = handler.newInstance();
:
}
命令和 CommandHandler 的定义如下
class Command {}
abstract class CommandHandler<C extends Command> {
public abstract void handle(C command);
}
这种通用结构使Java编译器强制命令和命令处理程序始终相互匹配。因此下面的例子将编译得很好
registerCommandHandler(CreateCustomerCommand.class, CreateCustomerCommandHandler.class);
但这不会编译
registerCommandHandler(CreateCustomerCommand.class, DeleteCustomerCommandHandler.class);
是否可以在C#中创建一个类似的类型安全结构,其中我在编译时可以限制传递给函数的类型的范围?。
答案 0 :(得分:4)
尝试:
public void registerCommandHandler<C, CH>(C command, CH handler)
where C : Command
where CH : CommandHandler<C>
{
// other C# code here
}
阅读完评论后,我想你想要这样的话:
public void registerCommandHandler<C, CH>()
where C : new()
where CH : new()
where C : Command
where CH : CommandHandler<C>
{
C instanceOfC = new C();
CH instanceOfCH = new CH();
}
答案 1 :(得分:0)
您可以限制或定义T,C或CH类型或其他类型的内容
where T : SomeType
...
例如,如果您有这2个接口(或抽象类或其他......)
public interface ICommand
{
}
public interface ICommandHandler<T> where T : ICommand
{
}
您可以在方法中限制两个参数必须匹配...
public void registerCommandHandler<C, CH>(C command, CH handler)
where C : ICommand
where CH : ICommandHandler<C>
{
}
您不必为原因定义接口,这只是一个例子。