2013-03-18 13 views
6

Bu genel kısıtlamayı işe almakta zorluk çekiyorum.Değer ve başvuru türleri için genel arabirim türü kısıtlaması tanımlama

Aşağıda iki arabirim var.

ICommandHandlers TResult türünü yalnızca ICommandResult kullanan türleri kullanmak için kısıtlayabilmek istiyorum ancak ICommandResult'un sağlanması gereken kendi kısıtlamaları vardır. ICommandResult, Sonuç özelliğinden potansiyel olarak bir değer veya referans türü verebilir. Belli bir şey eksik miyim? Teşekkürler.

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

Bunun ne tür referans türleri ve –

+0

değer türleri ile ilgisi olduğunu görmüyorum ICommandResult Sonuç niteliği bir değer veya referans türü olabilir .. – Matt

+0

"T: class/struct" ile sınırlandırılmadıkça başka bir jenerik tür olabilir. ? –

cevap

1

Sen (bana biraz daha temiz görünüyor) bu şekilde arayüzünü değiştirebilir:

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

Yoksa tipi parametresi ekleyebilirsiniz jenerik parametre listenize ICommandResult<TResult> için:

+0

Teşekkürler, ilk seçeneğinizin en zarif olduğunu düşünüyorum. – Matt

0

Sen ICommandHandler bir 3 genel tür parametresi ekleyebilirsiniz:

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 olmamalı ikinci arayüz göz daha böyle?

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

'dışarıda mı? Bunun mümkün olmadığını düşünüyorum! –

+0

Eh, emin olmadığım kısım bu. Şu anda .Net 3.5 ile çalışıyorum ... onu kaldıracağım. – DHN

+0

Bir parametrenin arabirim tanımında kontravaryant olduğunu tanımlayabilirsiniz: D –

0

Bu yapmalıyım:

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