Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用泛型调用重载方法_C#_Generics_Dynamic - Fatal编程技术网

C# 使用泛型调用重载方法

C# 使用泛型调用重载方法,c#,generics,dynamic,C#,Generics,Dynamic,我有一个类,它有许多重载方法: public class CustomerCommandHandlers { public void Handler(ChangeNameCommand command) { ... } public void Handler(ChangeAddressCommand command) { ... } } 我采用了以下方法: public void Handle<TCom

我有一个类,它有许多重载方法:

public class CustomerCommandHandlers 
{

    public void Handler(ChangeNameCommand command)
    {
      ...
    }

    public void Handler(ChangeAddressCommand command)
    {
      ...
    }
}
我采用了以下方法:

    public void Handle<TCommand>(TCommand command) where TCommand : ICommand
    {
        Handler((dynamic)command);
    }
这允许我从另一个注册命令和命令处理程序的类调用重载方法

但是,在创建其他CommandHandler(如ProductCommandHandlers、InventoryCommandHandlers等)时,我不希望在每个类中都包含动态方法

是否有一种方法可以为包含此方法的每个命令处理程序创建基类,然后从基类调用此方法


谢谢

如果您已经在使用dynamics,那么不妨尝试将其作为基类:

public class Basehandler 
{
    public void Handle<TCommand>(T command) where TCommand : ICommand {
        ((dynamic)this).Handler(command);
    }

    // As fallback if there is no implementation for the command type
    public void Handler(ICommand val) {
        // You could implement default or error handling here.
        Console.WriteLine(val == null ? "null" : val.GetType().ToString());
    }
}

如果您已经在使用dynamics,那么不妨尝试将其作为基类:

public class Basehandler 
{
    public void Handle<TCommand>(T command) where TCommand : ICommand {
        ((dynamic)this).Handler(command);
    }

    // As fallback if there is no implementation for the command type
    public void Handler(ICommand val) {
        // You could implement default or error handling here.
        Console.WriteLine(val == null ? "null" : val.GetType().ToString());
    }
}

太棒了。正是我想要的。回退是为了什么?因为它使用的是动态的,所以您不能确定是否有参数类型的实现。如果你想传递一些你没有处理程序的命令,你会得到一个RuntimeBinderException。要么处理该问题,要么使用回退处理程序实现自己的默认处理。编辑:修改答案以更好地匹配您的示例非常感谢您的帮助。非常棒。正是我想要的。回退是为了什么?因为它使用的是动态的,所以您不能确定是否有参数类型的实现。如果你想传递一些你没有处理程序的命令,你会得到一个RuntimeBinderException。要么处理该问题,要么使用回退处理程序实现自己的默认处理。编辑:修改答案以更好地匹配您的示例非常感谢您的帮助。