zuweisen von Typ zu variable, variable mit generischen statischen Klasse
Arbeite ich in einer C# - web service mit einem generischen statischen Klasse, die es braucht, geben. Ich Frage mich, warum diese nicht kompilieren:
Type type1 = typeof(MySnazzyType);
Assert.AreEqual(0, ConnectionPool_Accessor<type1>._pool.Count);
Gibt es diese Fehlermeldung:
Den Typ oder namespace-name 'Typ1' konnte nicht gefunden werden (fehlt eine using-Direktive oder ein Assemblyverweis?)
Und ReSharper, wenn ich den Mauszeiger über type1
in die zweite Zeile der code, der sagt "der Typ oder namespace-name erwartet". Gut, type1
ist ein Typ! Es ist eine variable vom Typ Type
! Es auch funktioniert nicht, wenn ich tun:
Type type1 = typeof(MySnazzyType);
Assert.AreEqual(0, ConnectionPool_Accessor<typeof(type1)>._pool.Count);
Ich hatte gehofft, zu vergeben meine Typen auf ein paar verschiedenen Type
Variablen und verwenden nur diejenigen, die in der Prüfung der verschiedenen generische, statische Klassen, anstatt aus MySnazzyType
jeder Zeit. Irgendwelche Ideen, oder bin ich stecken mit dabei:
Assert.AreEqual(0, ConnectionPool_Accessor<MySnazzyType>._pool.Count);
Edit: zu klären, MySnazzyType
ist nicht eine generische Klasse, noch gibt es Erben von einer generischen Klasse. Die einzige generische Klasse ist hier ConnectionPool_Accessor
.
Dank Pavel Kommentar "im Wesentlichen, Ihr problem ist, dass C# ist eine statisch typisierte Sprache", ich weiß jetzt, dass Ruby verdorben hat mir. 😉
- s/verwöhnte mich/hat mich gelehrt, schlechte Manieren/ 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst, ReSharper ist tatsächlich korrekt. Es ist nicht eine Typ, es ist ein variable. Zugegeben, es ist eine variable, die die Reflexion-Objekt, das entspricht einem Typ, aber das ist nicht genug.
Zwischen den <...> Klammern, Sie müssen schreiben Sie den Namen ein geben, nicht den Namen einer anderen Kennung.
Können Sie konstruieren generischen Objekte durch Reflexion, jedoch, und auf Ihre Eigenschaften zugreifen, auch statische, also sollten Sie in der Lage sein, den code umzuschreiben, das zu tun, jedoch haben Sie sich NUnit 2.5?
Aus der aktuellen release notes scheint es, dass unit-test-Klassen können generisch sein, und Sie können angeben, mit einem Attribut auf der test-Klasse, welche Arten es testen mit.
Dieses würde Ihnen erlauben, etwas so zu schreiben (beachten Sie, ich habe nicht getestet, ich habe nur geschaut bis die Namen der neuen Attribute in der Dokumentation):
Generische Typen werden bewertet in compile-Zeit, nicht in Laufzeit. Da es nicht zur Laufzeit bestimmt mal was
type1
werden, dieses Konstrukt ist nicht erlaubt.Dies ist eigentlich das, was Resharper sagt:
type1
ist nicht eine Art, es ist eine variable vom TypType
, (so, wie es sein könnte ein Objekt vom TypString
).type1
werden, da es geschrieben werdentypeof(MySnazzyType)
?ConnectionPool_Accessor<>
, und es ist in der Tat gelöst, zur compile-Zeit. Und an diesem Punkt gibt es keine Möglichkeit zu sagen, welche Art wirdtype1
zu beheben. Im wesentlichen, Ihr problem ist, dass C# ist eine statisch typisierte Sprache.type1
ist ein variable vom Typ "Referenz aufSystem.Type
. Letzteres ist kein Typ! Es ist ein Klasse, von denen Instanzen beschreiben ein Typ.type1
wird, Schätze ich, dass der compiler nicht so weit gehen. Selbst wenn es das täte,type1
wäre noch eine variable, nicht ein Typ.Den
TestFixture
Attribut sollte Sie auch, aber nur für das heck von ihm: wollte man dies alles zur Laufzeit, die Sie tun könnten, so mit der spiegelung.Dann könnten Sie fortfahren zu tun, was Sie wollen, mit der spiegelung auf
poolType
. Natürlich, das wird ein großer Schmerz in den Hintern, es sei denn, Sie verwenden C# 4.0 dynamische Typisierung.