我在使用这个通用约束时遇到了一些麻烦。
我有两个接口。
我希望能够将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 );
}
答案 0 :(得分: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 );
}
答案 1 :(得分:0)
您可以向ICommandHandler添加第3个泛型类型参数:
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 );
}
答案 2 :(得分:0)
嗯,您的第二个界面看起来不应该更像这样吗?
public interface ICommandHandler<in TCommand, ICommandResult<TResult>>
where TCommand : ICommand
{
TResult Execute(TCommand command);
}
答案 3 :(得分:0)
这应该这样做:
public interface ICommandHandler<in TCommand, out TResult>
where TCommand : ICommand
where TResult : ICommandResult<TResult>
{
TResult Execute( TCommand command );
}