Generics in c# & Zugriff auf die statischen Elemente von T
Meine Frage bezieht sich auf c# und wie der Zugriff auf Statische memebers ... Naja ich weiß nicht wirklich, wie es zu erklären (welche Art ist schlecht für eine Frage, ist es nicht?) Ich will Ihnen nur einige Beispiel-code:
Class test<T>{
int method1(Obj Parameter1){
//in here I want to do something which I would explain as
T.TryParse(Parameter1);
//my problem is that it does not work ... I get an error.
//just to explain: if I declare test<int> (with type Integer)
//I want my sample code to call int.TryParse(). If it were String
//it should have been String.TryParse()
}
}
Also danke Jungs für Eure Antworten (übrigens ist die Frage: wie würde ich dieses problem lösen ohne eine Fehlermeldung). Diese wahrscheinlich Recht einfache Frage für Euch!
Dank, Niklas
Edit: Danke Euch allen für Eure Antworten!
Obwohl ich denke, dass die try - catch-phrase ist der eleganteste, aber ich weiß aus meiner Erfahrung mit vb, dass es wirklich ein Mist. Ich habe es einmal, und es dauerte ungefähr 30 Minuten um ein Programm zu starten, das später auf dauerte nur 2 Minuten, um zu berechnen, nur weil ich vermieden try - catch.
Dies ist der Grund, warum ich entschied mich für die swich-Anweisung als die beste Antwort. Es macht den code etwas komplizierter, aber auf der anderen Seite Stelle ich es mir relativ schnell und relativ leicht zu Lesen. (Obwohl ich immer noch denke, es sollte eine elegantere Möglichkeit ... vielleicht in die nächste Sprache, die ich lernen 😛 )
Aber wenn Sie einige andere Vorschlag, den ich bin immer noch warten (und bereit zur Teilnahme)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer mehr Weg, es zu tun, diesmal auch einige Reflexion in der Mischung:
Der nächste Schritt wäre zu versuchen,
Mit voller parameter-Typ-matching usw.
Das problem ist, dass TryParse ist nicht festgelegt auf eine Schnittstelle oder Basisklasse überall, so dass Sie kann nicht gehen von der Annahme aus, dass der Typ ging in Ihre Klasse haben, die Funktion. Es sei denn, Sie können contrain T in irgendeiner Weise, werden Sie in dieser eine Menge.
Einschränkungen für Typparameter
Kurze Antwort, können Sie nicht.
Lange Antwort, die Sie betrügen können:
Machte ich eine statische Wörterbuch-holding Delegierter für die TryParse-Methode, die von jedem Typ, den ich verwenden könnte. Ich schrieb dann eine generische Methode zum nachschlagen das Wörterbuch auf und übergeben Sie den Anruf an die entsprechende Stellvertretung. Da jeder Delegierte hat eine andere Art, die ich nur speichern Sie Sie als Objekt-Referenzen auf und warf Sie zurück auf die entsprechenden Generika geben, wenn ich Sie wiederbekommen. Beachten Sie, dass für den Willen ein einfaches Beispiel, das ich ausgelassen habe, Fehler zu überprüfen, wie um zu prüfen, ob wir einen Eintrag in das Wörterbuch für den angegebenen Typ.
Zugriff auf ein Mitglied einer bestimmten Klasse oder Schnittstelle, die Sie verwenden müssen, um die Where-Schlüsselwort, und geben Sie die Schnittstelle oder Basisklasse, hat die Methode.
Im obigen Beispiel TryParse kommt nicht von einem interface oder Basisklasse, also, was Sie versuchen zu tun oben, ist nicht möglich. Am besten verwenden Sie einfach Konvertieren.ChangeType und ein try/catch-Anweisung.
Meinst du etwas wie das hier tun:
Leider kann man nicht überprüfen, für die TryParse-Muster, da es statisch ist - was leider bedeutet, dass es ist nicht besonders gut geeignet, um Generika.
Der einzige Weg, dies zu tun genau das, was du suchst, wäre die reflektion verwenden, um zu überprüfen, ob die Methode existiert für T.
Weitere option ist, um sicherzustellen, dass das Objekt, das Sie senden, ist ein Cabrio-Objekt, indem er die Art zu IConvertible (alle primitiven Typen IConvertible implementieren). Dies würde ermöglichen es Ihnen, konvertieren Sie Ihre parameter für den gegebenen Typ sehr flexibel.
Könnte man auch eine Variante, dies über ein 'Objekt' Art statt, wie Sie ursprünglich hatten.
Ok, Jungs: Danke für den Fisch. Jetzt mit Ihren Antworten und meine Forschung (vor allem die Artikel auf die Begrenzung generische Typen zu geometrieelementen) ich zeige dir meine Lösung.
Dies ist nicht wirklich eine Lösung, aber in bestimmten Szenarien, es könnte eine gute alternative sein: dann können Wir auch einen zusätzlichen Delegierten der generischen Methode.
Um zu verdeutlichen, was ich meine, lassen Sie uns ein Beispiel verwenden. Lassen Sie uns sagen, wir haben einige generische factory-Methode, die sollen erstellen Sie eine Instanz von T, und wir wollen, dass es dann eine andere Methode aufgerufen, die für die Benachrichtigung oder zusätzliche Initialisierung.
Betrachten Sie die folgende einfache Klasse:
Und die folgende statische Methode:
So jetzt wären wir zu tun haben:
Jedoch, wir könnten unsere Methode, um eine zusätzliche Stellvertretung:
Und jetzt ändern wir den Aufruf:
Natürlich ist dies nur sinnvoll in ganz bestimmten Szenarien. Aber das ist die sauberste Lösung in dem Sinne, dass wir bekommen compile-time Sicherheit, es gibt keine "Hacker" beteiligt war, und der code ist tot einfach.
Du wahrscheinlich nicht.
Zunächst, wenn es möglich sein sollte, müssten Sie eine festere Schranke für T, so der typechecker sicher sein konnte, dass Sie alle möglichen Substitutionen für T hatte eigentlich eine statische Methode aufgerufen, TryParse.
Möchten Sie vielleicht Lesen Sie meine früheren post auf die Begrenzung generische Typen zu geometrieelementen. Dies kann Ihnen einige Hinweise bei der Begrenzung der Typ, der übergeben werden kann, um die generische (seit TypeParse ist offensichtlich nur für eine bestimmte Anzahl von primitiven ( string.TryParse offensichtlich die Ausnahme, was nicht sinnvoll ist).
Sobald Sie haben eher eine Griff auf die Art, können Sie dann versuchen, zu analysieren. Möglicherweise müssen Sie ein wenig von einem häßlichen Schalter drin (zum Aufruf der richtigen TryParse ), aber ich denke Sie erreichen die gewünschte Funktionalität.
Wenn Sie mich brauchen, um zu erklären, alle der oben genannten weiter, dann bitte Fragen 🙂
Besten code: beschränken Sie T ValueType diese Weise:
"Struktur" bedeutet hier einen Wert geben.
String ist eine Klasse, nicht ein Wert-Typ.
int, float, Enums sind alle Wert-Typen.
btw der compiler nicht akzeptieren Aufruf von statischen Methoden oder Zugriff auf statische member auf 'type Parameter' wie in folgendem Beispiel wird nicht kompilieren 🙁
=> Fehler 1 'T' a "- Typ-parameter', das gilt nicht in den gegebenen Kontext
SL.
Nicht, wie Statik funktioniert. Sie haben zu denken, Statik, sozusagen in einer Globalen Klasse, auch wenn Sie verteilen sich auf eine ganze Reihe von Arten. Meine Empfehlung ist es, eine Immobilie innerhalb der T-Instanz, die Zugriff auf die erforderlichen statischen Methode.
Auch T ist eine tatsächliche Instanz von etwas, und genau wie jede andere Instanz, die Sie nicht in der Lage, den Zugriff auf die Statik für diese Art, durch den instantiierten Wert. Hier ist ein Beispiel, was zu tun ist: