2010-08-01 88 views
2

我很可能会在这里丢失一些明显的东西;但如果我有以下几点:有没有办法避免必须在C#中链接泛型类型参数?

public interface IRequest<out T> 
    where T : class 
{ 
    T Request 
    { 
     get; 
    } 
} 

和:

public interface IResponse<out T> 
    where T : class 
{ 
    T Response 
    { 
     get; 
    } 
} 

然后它使用这些接口,泛型类型参数的第三接口:

public interface IResponder<in TRequest, TRequestValue, out TResponse, TResponseValue> 
    where TRequest : IRequest<TRequestValue> 
    where TResponse : IResponse<TResponseValue> 
    where TRequestValue : class 
    where TResponseValue : class 
{ 
    TResponse Query(TRequest request); 
} 

有没有办法避免必须通过TRequestValueTResponseValue作为通用参数到IResponder(并因此避免必须复制相关的约束) ?

基本上我宁愿有类似下面的内容到的泛型类型参数的数量减少到IResponder(我知道这不会在此刻编译):

public interface IResponder<in TRequest, out TResponse> 
    where TRequest : IRequest 
    where TResponse : IResponse 
{ 
    TResponse Query(TRequest request); 
} 

唯一的办法我可以认为这样做是编写两个非通用接口(IRequestIResponse),然后使IRequest<T>IResponse<T>实现这些,但这在某种程度上似乎是错误的。

我完全知道我可能因为我在这里做事情而遇到了这个问题,所以请随时提出我做错了什么!

注意:整个Request,Response,Responder示例实际上并不是我正在编写的代码,而是尝试支持我的问题的示例。

回答

1

您对创建单独的非通用接口的想法实际上是适应非通用场景的C#中常用的方法。 (例如IList <T>和IList)IMO,在您的情况下,仿制药很可能不会增加太多价值。看起来您正在使用它们来限制人们使用您的类的方式,而不是试图实际获得重用和简化您的代码。我的建议是使用非通用的IRequest和IResponse接口,并简单地让Responder直接使用这些接口,而不使用任何泛型。如果你真的认为Query方法具有精确的正确类型而不必进行任何转换就很重要,那么应该一路走下去,并接受所有类型约束的详细程度。

+0

干杯柯克。我认为你说得很好;再看一下我的设计,我不认为这两个接口实际上是通用的,所以我会在我们讲话时重新审视它。 – Dougc 2010-08-02 08:24:00

1

不需要。IRequest在IRequestValue方面不一定是正确的。 你明确了,但这只是因为抽象语义。编译器不知道这一点。

请考虑如果您对功能参数采用相同的方法。假设编译器可以推断tramp参数是否合理?不是,你必须手动传递它们,而且无法绕过它。

相关问题