有没有办法使用任何新的C#4功能清理以下通用方法?

时间:2010-11-15 15:59:04

标签: linq c#-4.0

我刚刚修改了一个处理我的DDD命令的方法(之前它没有返回类型):

public static CommandResult<TReturn> Execute<TCommand, TReturn>(TCommand command) 
     where TCommand : IDomainCommand
{
    var handler = IoCFactory.GetInstance<ICommandHandler<TCommand, TReturn>>();
    return handler.Handle(command);
}

这个方法没问题,做了我想做的事情,但是使用它会产生一些不好的代码:

CommandResult<Customer> result = 
    DomainCommands.Execute<CustomerCreateCommand, Customer>
    (
        new CustomerCreateCommand(message)
    );

在我添加Customer返回类型TReturn之前,它很好又整洁,并且该方法可以根据其用法推断出类型。然而,这已不再可能。

有没有办法使用任何新的C#功能,我可以重写上面的内容使其更整洁,即使用Func,Action,Expression等?我可能期待不可能的事情,但是我厌倦了编写这么多代码来调用一个过去非常简单的方法。

1 个答案:

答案 0 :(得分:1)

稍微减少它的一个选项是为无法推断的类型参数设置静态泛型类型,允许您只使用一个类型参数的泛型方法可以推断:

public static class DomainCommands<TReturn>
{
    public static CommandResult<TReturn> Execute<TCommand>(TCommand command) 
        where TCommand : IDomainCommand
   {
      var handler = IoCFactory.GetInstance<ICommandHandler<TCommand, TReturn>>();
      return handler.Handle(command);
   }
}

然后:

var result = DomainCommands<Customer>.Execute(new CustomerCreateCommand(msg));

它不是很多更好,但它稍微好一些。当然,如果域命令类型本身可能是通用的,那可能会有所帮助 - 因此CustomerCreateCommand将实现IDomainCommand<Customer>。如果您仍然需要非通用IDomainCommand,则可以从IDomainCommand<T>派生IDomainCommand