In breve, non è possibile risolvere il problema (impedire che IEnumerable<>
da essere passato a un metodo generico) con i generici. Questo perché non è possibile avere vincoli generici negativi (ad esempio, tutto tranne someClass
). L'unica ragione per cui esistono limitazioni generiche è consentire al compilatore di sapere quale firma aspettarsi sul tipo generico. Non è quello di fornire allo sviluppatore segnali di progettazione.
Oltre a requisiti esterni non specificati, è possibile definire il tipo generico all'interfaccia, anziché il metodo. Ciò non garantisce che T
non possa implementare IEnumerable<>
; tuttavia, fa assicurarsi che ValidateList
debba accettare un elenco di ciò che viene passato a Validate
. Ciò significa che T
può essere una matrice, ma che imporrebbe ValidateList
di accettare una matrice di matrici.
Se si lasciano i tipi generici a livello di metodo, anche se entrambi hanno un tipo generico denominato T
, questi tipi in realtà non hanno nulla a che fare l'uno con l'altro.
Tipo generico definito all'interfaccia.
public interface ISomeInterface<T>
{
ValidationResult Validate(T t);
IList<ValidationResult> ValidateList(IEnumerable<T> entities);
}
questo sarebbe attuata come:
public class SomeClass<T> : ISomeInterface<T>
{
ValidationResult Validate(T t)
{
// Do something ...
}
IList<ValidationResult> ValidateList(IEnumerable<T> entities)
{
// Do something ...
}
}
e utilizzato in questo modo:
var myInstance = new SomeClass<int>();
int obj = 5;
int arr = new [] {1,2,3};
myInstance.Validate(obj);
myInstance.ValidateList(arr);
myInstance.Validate(arr); // should throw compiler error
fonte
2013-05-06 14:47:45
aggiungi alla vostra dichiarazione di interfaccia –
x4rf41
@TimSchmelter Vero, ma è possibile passare un elenco a 'Validate', che è ciò che non vuole – Servy
Convalidare con un oggetto è un sottoinsieme della funzionalità fornita dal metodo ValidateList . Perché non avere un solo metodo specificato nell'interfaccia IList Validate (Entità IEnumerable ); dove possono passare in un oggetto IEnumerable di un oggetto, se questo è tutto ciò che devono essere convalidati. c'è un forte motivo per rompere il caso speciale di un oggetto? –