2016-02-17 21 views
6

vorrei scrivere il seguente metodoCome rendere un metodo generico che prendono un tipo generico

private void Foo<T, TItem>(T<TItem> param1) 

Dove T deve essere un tipo generico che prende TItem come informazioni generiche.

esempio chiamata sarebbe come:

private void Main() 
{ 
    List<int> ints = new List<int>(); 
    Foo<List, int>(ints);  
} 

Edit: Nel mio caso avrei solo bisogno di per le collezioni. Il caso di utilizzo effettivo è che volevo scrivere un metodo che aggiunge qualcosa ad un ICollection purtroppo il ICollection non ha un metodo .Add solo lo ha lo ICollection<T>.

Non posso cambiare il metodo per:

private Foo<T>(ICollection<T>) 

poiché con che sto perdendo le informazioni che tipo ha l'elenco è, che è più importante per me di quello che digitare le voci all'interno della lista.

così è nata l'idea di cui sopra, che non ha funzionato.

+0

non credo che sia possibile dato che 'list' si aspetta sempre un parametro generico. – MutantNinjaCodeMonkey

+1

Non penso che tu possa fare quel vincolo. Che dire di avere T come un tipo generico che implementa IInterface dove T deriva da TItem? –

+0

Non capisco davvero come 'Foo' richieda che' T' e 'TItem' siano correlati nel modo descritto; potresti dare un esempio più specifico? – Codor

risposta

7

Poiché è necessario che solo per le collezioni, si potrebbe descrivere un metodo come questo:

private void Foo<T, TItem>(T param1) 
    where T: ICollection<TItem> 
{ 
} 

Tuttavia, in questo caso è necessario fornire tipo generico specifico (List<int>) come primo parametro generico, non è possibile utilizzare solo List:

List<int> ints = new List<int>(); 
Foo<List<int>, int>(ints); 
+0

'' IEnumerable '' ?? –

+0

@EhsanSajjad Poiché 'ICollection ' implementa 'IEnumerable ' è possibile utilizzare uno o l'altro, che dipende dai requisiti – dotnetom

+0

Questa soluzione sembra funzionare, ma un po 'mi fa schifo che devo specificare le informazioni di tipo generico, c'è forse un po' modo intorno ad esso? –

0

mi sembra si sono catturati in una trappola mente. C'è probabilmente un modo migliore per risolvere qualunque cosa tu stia cercando di fare.

In ogni caso, provare a utilizzare Dictionary. Non è necessario scrivere effettivamente un metodo.

int number = 15; 
double dub = 15.5; 
Button button = new Button(); 

Dictionary<object, Type> typeGlossary = new Dictionary<object, Type>(); 
typeGlossary.Add(number, typeof(int)); 
typeGlossary.Add(dub, typeof(double)); 
typeGlossary.Add(button, typeof(Button)); 

Alla fine, il vostro avanti infuria cervello in codice iniettato darà al tentativo di un forte sistema fortemente tipizzato di C#. Lo facciamo tutti a un certo punto.

1

Forse questo può aiutare:

Creare una classe base e una classe derivata.

public class Item 
{ 

} 

public class Item<T> : Item 
{ 
    T Value; 

    public Item(T value) 
    { 
     Value = value; 
    } 
} 

È quindi possibile utilizzarlo come si desidera:

public class SomewhereElse 
{ 
    public void Main() 
    { 
     List<Item> itemCollection = new List<Item>(); 
     itemCollection.Add(new Item<int>(15)); 
     itemCollection.Add(new Item<string>("text")); 
     itemCollection.Add(new Item<Type>(typeof(Image))); 
     itemCollection.Add(new Item<Exception>(new StackOverflowException())); 
     itemCollection.Add(new Item<FormWindowState>(FormWindowState.Maximized)); 
     // You get the point.. 
    } 
} 
Problemi correlati