限制类型参数

时间:2013-10-13 14:34:42

标签: c# java generics

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

2 个答案:

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

    }

您不必为原因定义接口,这只是一个例子。