Ja:
if (typeof(T) == typeof(MyClass))
{
MyClass mc = (MyClass)(object) t;
}
else if (typeof(T) == typeof(List<MyClass>))
{
List<MyClass> lmc = (List<MyClass>)(object) t;
}
Es ist etwas seltsam, dass Sie über eine Besetzung gehen müssen zu widerlegen, aber das ist nur die Art, wie Generika funktionieren - es gibt nicht so viele Konvertierungen von einem generischen Typ, wie Sie vielleicht erwarten.
Natürlich eine andere Alternative ist die normale Ausführungszeit Prüfung zu verwenden:
MyClass mc = t as MyClass;
if (mc != null)
{
// ...
}
else
{
List<MyClass> lmc = t as List<MyClass>;
if (lmc != null)
{
// ...
}
}
, die unterschiedlich zu dem ersten Codeblock verhalten wird, wenn t
null ist, natürlich.
würde ich versuchen, diese Art von Code, wenn möglich, jedoch zu vermeiden - es manchmal notwendig sein kann, aber die Idee von generischen Methoden in der Lage seine generic Code zu schreiben, die für jede Art die gleiche Weise funktioniert .
Ich habe eigentlich ein etwas komplizierteres Problem. Was ist, wenn MyClass von MyBaseClass abgeleitet ist und es viele weitere MyClasses gibt, die alle von MyBaseClass abgeleitet sind? – synergetic
@synergetic: Sie haben die Typhierarchie beschrieben, aber nicht, was Sie damit machen wollen. Sie können reflection (zB 'typeof (T) .BaseType' oder' typeof (T) .IsAssignableFrom (...) 'verwenden, um die Typhierarchie zu untersuchen, wenn das nützlich ist. Ich würde es trotzdem versuchen, wenn es möglich ist :) –
Hasse hier ein nasses Handtuch, aber diese Antwort ist unzureichend, wenn T tatsächlich ein Boxed-Typ ist (zB: object boxedMyClass = new MyClass()). In solchen Fällen ist der vom Operator typeof zurückgegebene Typ ein Objekt, nicht MyClass, was dazu führt, dass der obige Typ der Überprüfung fehlschlägt. Meiner Meinung nach ist dies der Punkt, an dem C# als Sprache zu kurz kommt: Es geht sowohl um generische Typüberprüfung als auch um komplexe ontologische Logik (z. B. kann man in C# nicht so etwas sagen wie "aLifeform ist Säugetier und nicht Bär")). – rmiesen