Sì:
if (typeof(T) == typeof(MyClass))
{
MyClass mc = (MyClass)(object) t;
}
else if (typeof(T) == typeof(List<MyClass>))
{
List<MyClass> lmc = (List<MyClass>)(object) t;
}
E' un po 'strano che avete bisogno di andare via un cast da obiettare, ma questo è solo il modo in cui funzionano i generici - non ci sono tante conversioni da un tipo generico come ci si potrebbe aspettare.
Naturalmente un'altra alternativa è quella di utilizzare il normale controllo tempo di esecuzione:
MyClass mc = t as MyClass;
if (mc != null)
{
// ...
}
else
{
List<MyClass> lmc = t as List<MyClass>;
if (lmc != null)
{
// ...
}
}
Che si comportano in modo diverso per il primo blocco di codice se t
è nullo, naturalmente.
avrei provo per evitare questo tipo di codice ove possibile, tuttavia - può essere necessario a volte, ma l'idea di metodi generici è essere in grado di scrivere codice generico che funziona allo stesso modo per qualsiasi tipo .
fonte
2010-01-05 06:24:48
In realtà ho un problema un po 'più complicato. Cosa succede se MyClass deriva da MyBaseClass e ci sono molte altre MyClasses che derivano da MyBaseClass? – synergetic
@synergetic: hai descritto la gerarchia di tipi, ma non quello che vuoi fare con esso. Puoi usare reflection (ad es. 'Typeof (T) .BaseType' o' typeof (T) .IsAssignableFrom (...) 'per esplorare la gerarchia dei tipi, se è utile, proverei comunque ad evitarlo, se possibile :) –
L'odio per essere un asciugamano bagnato qui, ma questa risposta non è sufficiente nei casi in cui T è in realtà un tipo in scatola (es: oggetto boxedMyClass = new MyClass()). In casi come questo, il tipo restituito dall'operatore typeof sarà object, non MyClass, causando il fallimento del controllo typeof di cui sopra. Secondo me, è qui che C# cade brevemente come lingua: occupandosi sia del controllo generico del tipo che della complessa logica ontologica (es. Non c'è modo di dire qualcosa come "aLifeform è Mammal e non Bear" in C# senza entrare nella riflessione). – rmiesen