C #. È è possibile avere una classe generica statico con un vincolo di tipo base che ha un metodo con un ulteriore vincolo tipo base
-
28-09-2019 - |
Domanda
Mi piacerebbe essere in grado di creare un tipo generico statica con un vincolo di tipo di base come
public static class Manager<T> where T : HasId
{
public static T GetSingleById(ref List<T> items, Guid id)
{
// the Id is a property provided by HasId
return (from i in items where i.Id == id select i).SingleOrDefault();
}
}
Quindi aggiungere un altro metodo
...
public static IEnumerable<T> GetManyByParentId(ref List<T> items, Guid parentId) where T : HasIdAndParentId
{
// the parentId is a property of HasIdAndParentId which subclasses HasId
return from i in items where i.ParentId == parentId select i;
}
...
Da HasIdAndParentId sottoclassi chassìd il vincolo T:. Hasid è soddisfatta ma il compilatore non accetterà il cui tipo base vincolo sul metodo
Tutte le idee?
Soluzione
In questo caso, non sei ridefinire il parametro type sul metodo, per cui non è possibile applicare eventuali nuovi vincoli. Si dovrebbe essere in grado di fare in questo modo:
public static IEnumerable<T2> GetManyByParentId<T2>(
ref List<T2> items, Guid parentId)
where T2 : T, HasIdAndParentId { .. }
Altri suggerimenti
Fare il metodo GetManyByParentId
sé generica, e legarlo parametro generico è di per T
:
public static IEnumerable<R> GetManyByParentId<R>(
ref List<R> items, Guid parentId)
where R : T, HasIdAndParentId
esempio di codice di Ben M non verrà compilato a meno HasIdAndParentId è un tipo di interfaccia, che non lo è, judjing dal nome.
Portando il secondo metodo stesso generico e rendendolo funzione della proprie parametro type (distinta da T) fornirà il vincolo desiderato.
public static IEnumerable<T1> GetManyByParentId<T1>(ref List<T1> items, Guid parentId) where T1 : HasIdAndParentId
{
// the parentId is a property of HasIdAndParentId which subclasses HasId
return from i in items where i.ParentId == parentId select i;
}