定义值和引用类型的泛型接口类型约束

本文关键字:泛型 接口类型 约束 引用类型 定义 | 更新日期: 2023-09-27 18:04:32

我有一些麻烦让这个通用约束工作。

下面有两个接口。

我希望能够约束ICommandHandlers结果类型仅使用实现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 );
}

定义值和引用类型的泛型接口类型约束

你可以把你的界面改成这样(这对我来说看起来更干净):

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 );
}

可以给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 );
}

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

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

应该这样做:

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