Variable Rückgabetyp einer Methode in C #

8

Ich möchte einer Methode einen Parameter geben und möchte, dass meine Methode Daten zurückgibt, indem ich den Parameter anschaue. Daten können vom Typ boolean, string, int oder so sein. Wie kann ich einen Variablentyp von einer Methode zurückgeben? Ich möchte keinen Objekttyp zurückgeben und ihn dann in einen anderen Typ umwandeln. Zum Beispiel:

%Vor%

Der Grund, warum ich das will, ist, dass ich eine Methode habe, die eine ausgewählte Spalte einer Zeile aus der Datenbank liest. Arten von Spalten sind nicht gleich, aber ich muss die Informationen jeder Spalte zurückgeben.

    
sanchop22 08.05.2012, 13:40
quelle

6 Antworten

14
  

Wie kann ich einen Variablentyp von einer Methode zurückgeben? Ich möchte keinen Objekttyp zurückgeben und ihn dann in einen anderen Typ umwandeln.

Nun, das ist im Grunde das, was Sie tun tun müssen. Alternativ können Sie, wenn Sie C # 4 verwenden, den Rückgabetyp dynamic angeben, wodurch die Konvertierung implizit erfolgen kann:

%Vor%

Grundsätzlich geben Sie Typen an, damit der -Compiler weiß, was zu erwarten ist. Wie kann das funktionieren, wenn der Typ nur zur Ausführung Zeit bekannt ist? Der Grund für die dynamic -Version ist, dass der Compiler im Grunde angewiesen wird, seine normale Arbeit bis zur Ausführungszeit zu verschieben - damit Sie die normale Sicherheit verlieren, die das zweite Beispiel zum Kompilieren versagen würde.

    
Jon Skeet 08.05.2012, 13:42
quelle
4

Verwende dynamic Schlüsselwort anstelle von BlahBlah , wenn du auf .Net 4.0 abzielst, aber wenn kleiner%% dann ist object deine sicherste Wette, weil es die Basisklasse für jede andere Klasse ist, die dir einfällt.

    
Nikhil Agrawal 08.05.2012 13:44
quelle
2

Es klingt, als ob dies ein guter Fall für Generika . Wenn Sie wissen, welchen Datentyp Sie beim Aufruf erwarten, können Sie diese spezielle generische Version der Funktion aufrufen.

    
Tim 08.05.2012 13:45
quelle
2

Erwägen Sie, etwas wie Dapper-dot-net (geschrieben von Marc Gravell und Sam Saffron bei unserem eigenen Stack Overflow) zu verwenden, um Dinge aus der Datenbank herauszuholen. Es behandelt die Datenbank für das Objekt-Mapping für Sie.

Wenn Sie darüber hinaus kein Werkzeug verwenden möchten, und Sie aus einer Datenbank ziehen, und Sie die Datentypen der verschiedenen Spalten zur Kompilierzeit kennen (wie es sich anhört), sollten Sie das wahrscheinlich tun Zeile für Zeile und nicht Spalte für Spalte arbeiten.

%Vor%

Hinweis: Sie könnten die Objektinitialisierersyntax und linq hier verwenden, aber das ist die einfachste Art, wie ich dies demonstrieren könnte, ohne eine Tonne zusätzlicher Sachen zu verwenden.

Beachten Sie auch, dass ich hier davon ausgehe, dass Sie eigentlich nicht "Demo", "2" und "true" zurückgeben möchten, sondern Werte, die die Zeile verwenden. Das bedeutet nur, dass Sie die fest codierten Werte in row.GetStringType(stringColumnIdx) oder etwas Ähnliches ändern.

    
Crisfole 08.05.2012 13:47
quelle
0

Verwenden Sie den Rückgabetyp als object , dann können Sie einen beliebigen Rückgabetyp abrufen. Sie müssen mit dem Rückgabetyp Ether durch Reflexion oder andere Methode umgehen.

überprüfen Sie dies:

%Vor%

Bearbeiten: Ich bin für stark typisierte Objekte und Sie können es leicht auf .net-Plattform implementieren.

%Vor%     
Niranjan Kala 08.05.2012 13:45
quelle
0

Ich schaue auf Ihre Fragen und einer ist besser als der zweite, aber letztens muss ich neu schreiben, um die Lösung besser zu verstehen. Und diese Lösung übersprang lange, wenn sie sonst stapeln und durch foreach auf Types enum ersetzen, wo wir alle Typen implementieren können, was wir brauchen. Ich benutze eher dynamisch, aber das ist auch verwendbar.

Die Hauptfunktion GetValueByValidating hat den Wert zurückgegeben, wenn der Typ definiert und möglich ist, in anderen Fällen gibt er false zurück Schau niranjan-kala das ist deine Hauptfunktion nach dem Neuschreiben.

%Vor%     
Michael Gordon 23.03.2016 08:21
quelle

Tags und Links