2013-03-18 5 views
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); 
} 
+0

참조 유형 및 값 유형과 관련이 무엇인지 알 수 없음 –

+0

ICommandResult Result 등록 정보는 값 또는 참조 유형이 될 수 있습니다. – Matt

+0

"T : class/struct"로 제한되지 않는 한 다른 일반 유형도 가능합니다 ? –

답변

1

당신은 (나에게 종류의 청소기 모양)이 당신의 인터페이스를 변경할 수 있습니다 :

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

을 또는 당신은 유형 매개 변수를 추가 할 수 있습니다 을 일반 매개 변수 목록에 추가하십시오.

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

감사합니다. 첫 번째 옵션이 가장 우아합니다. – Matt

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

흠해야하지 두 번째 인터페이스 살펴보기 다음과 같습니다?

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

거기'out'? 나는 이것이 불가능하다고 믿는다! –

+0

글쎄, 잘 모르겠다. 현재 .Net 3.5와 함께 작업 중이지만 제거하겠습니다. – DHN

+0

인터페이스 정의에서 매개 변수가 반공 변 수임을 정의 할 수 있습니다. D –

0

이 그것을 수행해야합니다

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