2013-03-18 9 views
6

Im avendo qualche problema a far funzionare questo vincolo generico.Definizione del vincolo del tipo di interfaccia generico per i tipi di valore e di riferimento

Ho due interfacce di seguito.

Desidero essere in grado di vincolare il tipo TResult ICommandHandlers per utilizzare solo i tipi che implementano ICommandResult, ma ICommandResult ha i propri vincoli che devono essere forniti. ICommandResult potrebbe potenzialmente restituire un valore o un tipo di riferimento dalla sua proprietà Result. Mi manca qualcosa di ovvio? Grazie.

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

Non vedo cosa questo abbia a che fare con tipi di riferimento e tipi di valore –

+0

La proprietà Result di ICommandResult può essere un valore o un tipo di riferimento .. – Matt

+0

Così può qualsiasi altro tipo generico se non vincolato con "dove T: class/struct" ? –

risposta

1

è possibile modificare l'interfaccia a questo (che sembra un po 'più pulito per me):

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

o si potrebbe aggiungere il parametro di tipo di ICommandResult<TResult> nell'elenco dei parametri generici:

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

Grazie, penso che la prima opzione sia la più elegante. – Matt

0

Si potrebbe aggiungere un parametro di tipo generico 3 al 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 non dovrebbe tuo look seconda interfaccia più simile a questo?

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

'out' lì? Credo che questo non sia possibile! –

+0

Beh, questa è la parte di cui non ero sicuro. Attualmente sto lavorando con .Net 3.5 ... Lo rimuoverò. – DHN

+0

È possibile definire che un parametro sia controverso nella definizione dell'interfaccia: D –

0

Questo dovrebbe farlo:

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