2016-01-14 122 views
6

我已經瀏覽了許多類似於這個問題的問題,但沒有一個真正觸及我想要做的事情。我所試圖做的是從外部源讀取的變量還包括它們的數據類型爲字符串數組列表:帶多種返回類型的方法

例子:

ID/Key  Type Value/Data; 
varName1 bool true; 
varName2 string str; 
varName3 int  5; 

我然後存儲這些對象到詞典中包含多個字符串的對象,ID也用作關鍵字。

我想要做的是現在創建一個方法,該方法使用switch語句將字符串轉換爲正確的數據類型,並返回它,而無需在方法調用中指定任何內容。該函數應該是這個樣子:

public ??? Method(string key) 
{ 
    if(dictionary.ContainsKey(ID)) 
    { 
     Var temp = dictionary[ID]; 

     switch (temp.Type) 
     { 
      case "bool": 
       return Convert.ToBoolean(temp.Value); 

      case "int" 
       return Convert.ToInt(temp.Value); 

      case "string" 
       return temp.Value; 
     } 
    } 

    return "NULL"; 
} 

方法調用應該是這個樣子:

int x = Method(string key); 
string word = Method(string key); 
boolean isTrue = Method(string key); 

也許我錯過了一些東西,但我還沒有找到的東西,確實相當的東西喜歡這個。對此的任何和所有想法也是受歡迎的。

+2

對不起,沒有這樣的事情在C#中。一種方法有一個固定的返回類型。你可以使用'object'作爲你的返回類型,但你必須施放。 – adv12

+1

你必須使該方法通用才能工作。當你使用它時,它最終會看起來像'string word =方法(key)'。你也必須做'bool?'和'int?'因爲當你沒有找到密鑰時你想返回'null'。 – juharr

+0

如果你的值被存儲爲'Object',你可以做'(T)值'。什麼阻止你從'string word =(string)方法(string key);',給定,方法返回'object' –

回答

6

編譯器有沒有辦法三個方法來區分來電您提供,因爲他們看起來都像Method(key);

一種選擇是返回object,然後期望消費代碼丟給他們想:

​​

您也可以使用關鍵字dynamic,使投隱:

public dynamic Method(string key) 
{ 
    if(dictionary.ContainsKey(key)) 
    { 
     var temp = dictionary[key]; 

     switch (temp.Type) 
     { 
      case "bool": 
       return Convert.ToBoolean(temp.Value); 

      case "int" 
       return Convert.ToInt(temp.Value); 

      case "string" 
       return temp.Value; 
     } 
    } 

    return "NULL"; 
} 

... 

int x = Method(key); 
string word = Method(key); 
bool isTrue = Method(key); 

然而,dynamic是一個非常強大的概念,它很容易失控,所以你必須非常小心。

在我看來,你期待你的調用代碼知道它期望爲每個鍵獲取哪種類型的對象。看起來也許是最好的辦法是隻讓用戶供應信息:

public T Method<T>(string key) 
{ 
    if(dictionary.ContainsKey(key)) 
     return (T) Convert.ChangeType(dictionary[key].Value, typeof(T)); 
    return default(T); 
} 

... 

int x = Method<int>(key); 
string word = Method<string>(key); 
bool isTrue = Method<bool>(key); 

這樣的話,就沒有必要跟蹤在第一時間在你的字典對象的類型值。

+1

我意識到OP使用'boolean',但在C#中它是'bool'或'Boolean'。 – juharr

+0

@juharr:對,謝謝。 – StriplingWarrior

+0

同樣來自OP,'Var'在C#中無效,應該是'var'。 –

0

函數的返回類型必須鍵入。與任何其他變量或操作一樣,從指定類型繼承的任何類型都是有效的返回值(這就是爲什麼對象允許任何值作爲值)。

我個人不認爲這是有益的,使一個方法有多種返回類型,但如果你真的想有一個方法有多種返回類型,你可以用.NET 4.0的dynamic類型:

private static void Main(string[] args) 
    { 
     int x = Method("varName3"); 
     string word = Method("varName2"); 
     bool isTrue = Method("varName1"); 
    } 

    private static dynamic Method(string key) 
    { 
     var dictionary = new Dictionary<string, KeyValuePair<Type, object>>() 
     { 
      { "varName1", new KeyValuePair<Type, object>(typeof(bool), false) }, 
      { "varName2", new KeyValuePair<Type, object>(typeof(string), "str") }, 
      { "varName3", new KeyValuePair<Type, object>(typeof(int), 5) }, 
     }; 

     if (dictionary.ContainsKey(key)) 
     { 
      return dictionary[key].Value; 
     } 

     return null; 
    } 

希望它有幫助

+0

非常奇妙,但不幸的是我僅限於3.5框架。背景:這是一個使用Unity的人的工具。 –

+0

如果您僅限於.NET 3.5,我會嘗試使該方法具有通用性: int x =方法(「varName3」); 請看看StriplingWarrior的回答。 – Sneijder