C #. È è possibile avere una classe generica statico con un vincolo di tipo base che ha un metodo con un ulteriore vincolo tipo base

StackOverflow https://stackoverflow.com/questions/3478238

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?

È stato utile?

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top