在C#中对泛型的接口类型进行约束会有什么意义?例如,
public interface IHandler<in T> where T : IProcessor
{
void Handle(T command);
}
简单地将IProcessor作为通用继承而没有任何约束不是更好吗?这样做有什么好处?
例如,
public class Test: IProcessor<T>{void Handle(T command);}
最佳答案 如果接口为空,则为 marker interface.
它可以用于对类外的类进行限制.与下面的示例一致,您可以限制装饰器只能装饰IProcessor的处理程序.
一个非常正当的理由是在申请装饰时:
假设命令参数接口有几个属性:
public interface IProcessor
{
int Id { get; }
DateTime Date { get; }
}
我们可以在IProcessor命令的所有处理程序上定义一个装饰器,它知道所有命令参数都有Id和Date:
public sealed class HandlerLogger<in T> where T : IProcessor
{
private readonly ILogger logger;
private readonly IHandlerLogger<T> decorated;
public HandlerLogger(
ILogger logger,
IHandlerLogger<T> decorated)
{
this.logger = logger;
this.decorated = decorated;
}
public void Handle(T command)
{
this.logger.Log(command.Id, command.Date, typeof(T).Name);
this.decorated.Handle(command);
}
}