6

我在让这个通用约束起作用时遇到了一些麻烦。

我下面有两个接口。

我希望能够将 ICommandHandlers TResult 类型约束为仅使用实现 ICommandResult 的类型,但 ICommandResult 有自己的约束需要提供。ICommandResult 可能会从其 Result 属性返回值或引用类型。我错过了一些明显的东西吗?谢谢。

public interface ICommandResult<out TResult>
{
    TResult Result { get; }
}

public interface ICommandHandler<in TCommand, TResult>  where TCommand : ICommand
                                                        where TResult : ICommandResult<????>
{
    TResult Execute( TCommand command );
}
4

4 回答 4

1

您可以将界面更改为此(对我来说看起来更干净):

public interface ICommandHandler<in TCommand, TResult> where TCommand : ICommand
{
    ICommandResult<TResult> Execute( TCommand command );
}

或者您可以将类型参数添加ICommandResult<TResult>到您的泛型参数列表中:

public interface ICommandHandler<in TCommand, TCommandResult, TResult> 
    where TCommand : ICommand
    where TCommandResult: ICommandResult<TResult>
{
    TCommandResult Execute( TCommand command );
}
于 2013-03-18T10:10:45.417 回答
0

您可以向 ICommandHandler 添加第三个泛型类型参数:

public interface ICommandResult<out TResult>
{
    TResult Result { get; }
}

public interface ICommandHandler<in TCommand, TResult, TResultType>  
                                                        where TCommand : ICommand
                                                        where TResult : ICommandResult<TResultType>
{
    TResult Execute( TCommand command );
}
于 2013-03-18T10:08:27.810 回答
0

嗯,你的第二个界面不应该更像这样吗?

public interface ICommandHandler<in TCommand, ICommandResult<TResult>>
    where TCommand : ICommand
{
    TResult Execute(TCommand command);
}
于 2013-03-18T10:08:46.307 回答
0

这应该这样做:

public interface ICommandHandler<in TCommand, out TResult>  
    where TCommand : ICommand
    where TResult : ICommandResult<TResult>
{
    TResult Execute( TCommand command );
}   
于 2013-03-18T10:10:43.717 回答