2016-11-29 7 views
1

ich eine Anwendung schreibe, die mehrere Datenbanken abfragen muss, so dass meine Verbindungszeichenfolgen zu standardisieren, schrieb ich die folgende Enumeration und Methode:(C#) Enum wird nicht zurückkehren int

class Program 
{ 
    enum DBEnum { DB1, DB2, DB3, DB4, DB5 } 

    static void Main(string[] args) 
    { 
     using (CacheConnection myConnection = new CacheConnection()) 
     { 
      myConnection.ConnectionTimeout = 9999; 
      myConnection.ConnectionString = DBSelect(DBEnum.DB1); 
      myConnection.Open(); 
     } 

    } 

    public static string DBSelect(int i) 
    { 
     string connectionString = ""; 

     switch (i) 
     { 
      case 0: 
       connectionString = *connection string*; 
       break; 
      case 1: 
       connectionString = *connection string*; 
       break; 
      case 2: 
       connectionString = *connection string*; 
       break; 
      case 3: 
       connectionString = *connection string*; 
       break; 
      case 4: 
       connectionString = *connection string*; 
       break; 
      default: 
       break; 
     } 
     return connectionString; 
    } 

} 

Aber das Problem ist, dass es den enum-Definitionen keinen numerischen Wert zuweist.

Laut MSDN, es sei denn, die Enum in einen anderen Datentyp gegossen wird, oder die Definitionen speziell definiert werden, sollten die Definitionen einen int-Wert haben mit 0

aber mir intellisense Start gripes, dass die Zeile:

myConnection.ConnectionString = DBSelect(DBEnum.DB1); 

hat ungültige Argumente, und wenn ich etwas sagen wie

int i = DBEnum.DB1; 

es fragt mich, ob ich ein gegossenes bin fehlt.

Danke!

+3

Warum nehmen Sie nicht die Methode ändern zu ein 'DBEnum' anstelle eines' int'? – juharr

+1

@juharr, weil ich ein Noob bin. Danke für diesen Vorschlag! –

+0

Mögliches Duplikat von [Warum benötigen Enums eine explizite Umwandlung in den Int-Typ?] (Http://stackoverflow.com/questions/4728295/why-enums-require-an-explicit-cast-to-int-type) –

Antwort

3

Es wird einen numerischen Wert zuweisen, das ist nicht das Problem. Sie versuchen, es als Int und nicht als Enum zu verwenden. Es gibt keine implizite Umwandlung von Ihrer Enumeration in int. Es gibt jedoch ein explizites. Nur „cast“ es

DBSelect((int)DBEnum.DB1); 

aber noch besser wäre es, die Methodensignatur und Implementierung

public static string DBSelect(DBEnume i) 
{ 
    string connectionString = ""; 

    switch (i) 
    { 
     case DB1: 
      connectionString = *connection string*; 
      break; 
     case DB2: 
      connectionString = *connection string*; 
      break; 
     case DB3: 
      connectionString = *connection string*; 
      break; 
     case DB4: 
      connectionString = *connection string*; 
      break; 
     case DB5: 
      connectionString = *connection string*; 
      break; 
     default: 
      throw new InvalidOperation(); 
      break; 
    } 
    return connectionString; 
} 

zu ändern, und dann sollten Sie die Enum Fällen bessere Namen geben. Zwingt Sie nicht, nur die angegebenen Werte zu verwenden. Jeder Wert des Basistyps kann in eine Enumeration umgewandelt werden. In Ihrem Fall ist (DBEnum)10012 gültig. ENUM funktioniert aber wirklich gut, wenn anstelle einer einfachen Sequenz, wie Sie Sie Informationen

DBEnum { 
    UserDb, 
    ArticleDb, 
    RenderedCacheDb, 
} 

usw. bieten haben (Natürlich weiß ich nicht, die Namen Ihrer DBs so nahm ich zufällig sind)

+0

Das macht viel Sinn. Vielen Dank. –

+0

Auch habe ich detailliertere Namen, aber nur um ein Beispiel zu nennen, und aus Sicherheitsgründen habe ich es nur in DB1 geändert. ABER ich habe die Methode geändert, um das Enum selbst zu nehmen, anstatt ein int. Vielen Dank. –

3

werfen Sie einfach die Enum als int wie

DBSelect((int)DBEnum.DB1); 

diese vorherige Frage Siehe über ENUM Ints Gießen. Get int value from enum

Bearbeiten: Sie sollten auch in Betracht ziehen, Ihre Verbindungszeichenfolgen im Konfigurationsmanager zu behalten. Sehen Sie in diesem MSDN-Artikel auf, wie zu tun, dass

https://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.connectionstrings(v=vs.110).aspx

+1

oder hinzufügen eine Methode: 'public static string DBSelect (DBEnum db) => DBSelect ((int) db);' – flakes

+0

Vielen Dank euch beiden! –

0

Es wird gefragt, ob Sie einen Cast "verpassen", da enum s und int s unterschiedliche Datentypen sind. Wie die anderen gesagt, müssen Sie es Guss Typ zu:

DBSelect((int)DBEnum.DB1); 

Sonst wirst du halten die bekommen „Kann nicht explizit konvertieren enum zu int32