2010-03-04 10 views
8

Da C# keine Unterstützung für freistehende Funktionen bietet, finde ich es schwierig, einen Platz für Umwandlungsfunktionen zu finden. Zum Beispiel möchte ich eine Enumeration in eine Zahl konvertieren. In C++ würde ich die folgende freistehende Funktion dafür machen:Wohin mit den Umwandlungsfunktionen?

Wie kann ich das elegant in C# machen? Soll ich eine statische Dummy-Klasse erstellen, um die Funktion zu halten, und wenn ja, wie finde ich einen aussagekräftigen Namen dafür? Oder sollte ich eine partielle Klasse Convert machen?

Irgendwelche Ideen?

Vielen Dank im Voraus.

Update: Im Nachhinein war mein Beispiel nicht sehr gut gewählt, da es eine Standardkonvertierung zwischen enum und int gibt. Dies wäre ein besseres Beispiel sein:

Person ConvertToPerson(const SpecialPersonsEnum e); 
+1

MyEnum e = (MyEnum) 3; oder MyInt i = (Int) e; sind beide akzeptable Möglichkeiten, um zwischen int und enum in C# zu konvertieren.Allerdings setze ich meine Konvertierungsfunktionen immer in eine Utility-Klasse. – jle

+0

+1 'partielle Klasse Convert' ist eine gute Idee. –

+3

Wenn Sie eine Umwandlung von einer Enumeration in eine Klasse Person wünschen, dann ** schreiben Sie einen Konvertierungsoperator **. Warum sollte man sich mit einer Methode herumärgern, wenn man einfach einen Operator schreiben kann, der das macht, was man will? –

Antwort

8

ich gehen würde:

namespace ExtensionMethods 
{ 
    public static class MyExtensions 
    { 
     public static int ConvertToInt(this MyEnum e) 
     { 
      var m; 

      // ... Implementation 

      return m; 
     } 
    } 
} 

Dann einfach verwenden Sie würden MyEnum.ConvertToInt(); Das gleiche gilt für mehrere Konvertierungen alle getan werden kann, aus derselben Klasse. Erweiterungsmethoden sind kurz gesagt, verdammt sexy.


Auch Eric's Kommentar über Typ-Wandler hat mich googeln. Ziemlich genial, aber ich bin mir nicht sicher, wie man sie mit einer Enum verwendet, aber für andere Konvertierungen sind sie sauber wie eine Pfeife zu implementieren. Werfen Sie einen Blick hier:

+0

Danke für das Beispiel. –

1

Ich würde empfehlen, dass Sie erstellen und Montage, die alle Ihre Hilfsmethoden/Konstanten und Aufzählungen enthalten würden, die in anderen Projekten verwendet werden.

Damit können Sie diese Baugruppe problemlos in andere Baugruppen einfügen, die sie benötigen, und zirkuläre Referenzen vermeiden.

9

Das obige Beispiel sieht wie ein Kandidat für eine Erweiterungsmethode aus.
Wenn das nicht möglich ist, definiere ich sie als statische Methoden in einer statischen Klasse; Normalerweise würde ich sie in eine statische Klasse namens XXXHelper setzen.

+0

In diesem speziellen Fall wäre eine Besetzung in Ordnung, im allgemeinen Fall stimme ich Gishu zu und versuche, Erweiterungsmethoden zu verwenden, bevor ich eine "Helfer" -Klasse hervorbringe. Halten Sie die Funktionalität so nahe wie möglich (unter Beibehaltung der SRP). –

+0

Sie haben Recht! Ich habe nicht erwartet, dass Erweiterungsmethoden an Aufzählungen arbeiten, aber anscheinend tun sie das. –

1

Kannst du nicht einfach einen Cast verwenden? (UInt32)e. Oder rufen Sie sonst Convert.ToUInt32(e)

+0

Ja, aber ich spreche über den allgemeinen Fall. Mein Beispiel war lediglich, die Situation klarzustellen. –

0

konfrontierte ich das ähnliche Problem einmal und ich tat dies

class Program 
{ 
    static void Main(string[] args) 
    { 
     string s = "123"; 
     int n = Convert.StringToInt(s); 
    } 
} 

class Convert 
{ 

    public static int StringToInt(string s) 
    { 
     // implementation 
    } 
    public static string IntToString(int n) 
    { 
     // implementation 
    } 
} 
+2

dafür ... warum benutzen Sie die .Net System.Convert Klasse? – SysAdmin