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.
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.
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.
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.
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.