如何从泛型类型调用重载方法

时间:2017-09-21 14:15:41

标签: c#

我已经定义了一个通用接口

interface IHandler<in TCommand> where TCommand:Command
{
     void Handle(TCommand command);
} 

和班级

public class MyHandler:
    IHandler<CommandA>,
    IHandler<CommandB>,
    IHandler<CommandC>
{
    public void Handle(CommandA command)
    {...}

    public void Handle(CommandB command)
    {...}

    public void Handle(CommandC command)
    {...}
}

由于某些原因,我需要动态调用处理程序,我所拥有的是IoC容器,处理程序的限定名称和参数实例(例如CommandB)。 我的问题是如何调用Handle方法?

public void DynamicCallHandleMethod(string typeName, Command command)
{
     Container container = new Container();
     container.Register<MyHandler>();

     object handler = container.Resolve(Type.GetType(typeName));
     //handler.Handle(command);  <---- How to make it?
}

注意,我知道反思可能是解决方案之一,所以我希望有另一种更优雅的方式,提前谢谢。

2 个答案:

答案 0 :(得分:1)

实现一个处理Command值的方法,该方法调用相应的(它们甚至可能是私有的)方法:

public void Handle(Command command)
{
    if(command is CommandA comA)
        Handle(comA);
    else if(command is CommandB comB)
        Handle(comB);
    else if(command is CommandC comC)
        Handle(comC);
    else
        // Handle if necessary.
}

还将处理程序作为解析时的对象进行转换,不会公开接口。您需要var或implicilty IHandler作为类型。

答案 1 :(得分:0)

创建一个'dynamic'变量并使用'command'赋值,然后将其传递给handle方法。这应该在运行时解析类型并选择适当的方法。

dynamic cmd = command;
handler.Handle( cmd );

或者,考虑实施访客模式。