| 

.NET C# Java Javascript Exception

5
Ich habe ein kleines Problem bei generischen Klassen, denn folgendes scheint einfach nicht zu gehen. Der Grund dafür ist dieses verdammte T.

var foo = Bar<int>;
if(foo is Bar<T>)
{
MessageBox.Show("It is!");
}
12.08.2011
Hendrik Lösch 1,5k 1 9
1 Antwort
11
Hallo Hendrik,

dieses "verdammte" T lässt man einfach weg.

Der Typ Bar<> (ohne T) ist eine sog. generische Typdefinition.
Der Typ Bar<T> ist ein sog. open constructed generic type und
der Typ Bar<int> ist ein sog. closed constructed generic type.

Dein Problem löst Du daher, indem Du überprüfst, ob es sich beim zu prüfenden Typ überhaupt um einen generischen Typ handelt und anschließend die generische Typdefinition vergleichst.

So klappts:

var foo = new Bar<int>();
var typeOfFoo = foo.GetType() ;

if (typeOfFoo.IsGenericType &&
typeOfFoo.GetGenericTypeDefinition().Equals((typeof(Bar<>))))
{
MessageBox.Show("It is!");
}


UPDATE:
Wie im Kommentar versprochen, habe ich mir Gedanken zu diesem Thema gemacht (auch wenns etwas länger gedauert hat). Das hat mich letztendlich dazu bewegt, einen eigenen Blog zu starten. Mein erster Post befasst sich genau mit dieser Thematik und ich habe eine Extension Method implementiert, die dem Problem von Hendrik begegnet. Bei Interesse: blog.mycupof.net.

Viel Erfolg
Florian
12.08.2011
ffordermaier 8,4k 3 9
3
Tolle Erklärung! Man könnte noch erwähnen, dass dieser Check bei von Bar<int> abgeleiteten Klassen nicht funktionieren würde. Ich schätze, man müsste statt Equals IsSubclassOf verwenden.
Marvin Steppat 12.08.2011
4
Du hast Recht, bei abgeleiteten Klassen funktioniert das nicht. IsSubclassOf hilft aber auch nicht weiter. Ich denke, eine umfassende Lösung wäre, eine ExtensionMethod "Is" für object zu definieren und darin dann die entprechenden Fälle abzudecken. Bin leider jetzt ein paar Tage weg, aber nächste Woche hab ich Zeit, dann schreib ich eine solche Methode und poste sie hier.
ffordermaier 12.08.2011
1
Verspätet, aber nicht vergessen. Bei Interesse zu meinen ausführlichen Gedanken zu diesem Thema und einer ready-to-use Extension Method, siehe Link im Update meines Posts.
ffordermaier 07.09.2011
1
Coole Sache ;-) Stell deinen Blog doch auch bei codekicker.news ein! (http://codekicker.de/news/eintragen). Evtl. wird es da bald auch eine englische Rubrik geben.
Marvin Steppat 08.09.2011

Stelle deine .net-Frage jetzt!