2016-11-29 106 views
1

我編寫需要查詢多個數據庫的應用程序,所以要規範我的連接字符串,我寫了下面的枚舉和方法:(C#)枚舉不會返回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; 
    } 

} 

但問題是它不會爲枚舉定義分配一個數值。

根據MSDN,除非枚舉澆鑄到一個不同的數據類型,或定義特別定義,這些定義應該有一個int值從0開始

然而智能感知抱怨對我來說,行:

myConnection.ConnectionString = DBSelect(DBEnum.DB1); 

有無效的參數,如果我這樣說

int i = DBEnum.DB1; 

它問我,如果我錯過了一個演員。

謝謝!

+3

你爲什麼不改變方法取一個'DBEnum'而不是'int'? – juharr

+1

@juharr因爲我是noob。謝謝你的建議! –

+0

[爲什麼枚舉需要顯式轉換爲int類型?](http://stackoverflow.com/questions/4728295/why-enums-require-an-explicit-cast-to-int-type) –

回答

3

它分配一個數值,這不是問題,這MSDN文章。你試圖把它用作int而不是枚舉。沒有從你的枚舉到int的隱式轉換。但是有一個明確的。只是「演員」它

DBSelect((int)DBEnum.DB1); 

但更重要的是改變方法簽名和實施

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; 
} 

,然後你應該給枚舉的情況下更好的名稱。不限制您只使用聲明的值。基本類型的任何值都可以投射到枚舉中。所以你的情況(DBEnum)10012是有效的。然而枚舉的作品真的很好,而不是一個簡單的順序,當你有你提供的信息

DBEnum { 
    UserDb, 
    ArticleDb, 
    RenderedCacheDb, 
} 

等等(當然我不知道你的DB的名字,所以我拿起隨機的)

+0

這很有意義。非常感謝你。 –

+0

此外,我有更詳細的名稱,但僅僅爲了舉例,出於安全原因,我只是將其更改爲DB1。但我確實改變了枚舉本身的方法,而不是int。非常感謝你。 –

3

只投枚舉爲int喜歡

DBSelect((int)DBEnum.DB1); 

查看關於鑄造枚舉整數此之前的問題。 Get int value from enum

編輯:另外你應該考慮保持你的連接字符串在配置管理器。參見如何做到這一點

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

+1

或add一個方法:'公共靜態字符串DBSelect(DBEnum db)=> DBSelect((int)db);' – flakes

+0

非常感謝你們! –

0

它詢問您是否「缺少演員」,因爲enum s和int s是不同的數據類型。像其他人說,你需要類型強制轉換:

DBSelect((int)DBEnum.DB1); 

否則,你就不斷收到「不能顯式轉換enumint32