0

在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();
   :
}

Command和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# 中创建类似的类型安全构造,我在编译时可以限制传递给函数的类型的范围?

4

2 回答 2

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();
    }
于 2013-10-13T14:39:07.800 回答
0

您可以限制或定义 T、C 或 CH 类型应允许的内容,或者使用 where T : SomeType...

例如,如果您有这两个接口(或抽象类或其他...)

    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>
    {

    }

您不必为此定义接口,这只是一个示例。

于 2013-10-13T14:44:12.247 回答