2013-03-18 21 views
6

Mam pewne problemy z uzyskaniem tego ogólnego ograniczenia do działania.Definiowanie ograniczenia typu ogólnego interfejsu dla wartości i typów odniesienia

Mam dwa interfejsy poniżej.

Chcę móc ograniczyć typ TRommultommandHandlers TResult do używania tylko typów implementujących ICommandResult, ale ICommandResult ma własne ograniczenia, które muszą zostać dostarczone. ICommandResult może potencjalnie zwrócić wartość lub typ odniesienia z jego właściwości Result. Czy brakuje mi czegoś oczywistego? Dzięki.

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

Nie widzę, co to ma do czynienia z typów odniesienia i typów wartości –

+0

Właściwość Wynik ICommandResult może być wartością lub typem odniesienia. – Matt

+0

Podobnie jak każdy inny typ ogólny, chyba że jest ograniczony do "where T: class/struct" ? –

Odpowiedz

1

Można zmienić interfejs do tego (co wygląda trochę czystsze do mnie):

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

Albo można dodać parametr typu z ICommandResult<TResult> do ogólnego wykazu parametrów:

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

Dzięki, myślę, że twoja pierwsza opcja jest najbardziej elegancka. – Matt

0

Można dodać 3rd rodzajowego parametr typu do 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); 
} 
0

Hmm nie powinien swoją drugą wygląd interfejsu bardziej jak to?

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

"na zewnątrz"? Uważam, że nie jest to możliwe! –

+0

To jest część, której nie byłem pewien. Obecnie pracuję z .Net 3.5 ... usunę go. – DHN

+0

Możesz zdefiniować, że parametr jest sprzeczny z definicją interfejsu: D –

0

ten powinien zrobić:

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