2009-11-30 38 views
1

我有一個方法,其調用者需要不同的數據類型。我可以將它們放在每個調用者中重複十次所需的轉換,但在調用方法中執行一次似乎更有效。如何從方法返回變量數據類型

public String myMethod(String myArg) 
{  
    return DoSomething(myArg); 
} 

public Int32 myMethod(String myArg) 
{ 
    return Convert.ToInt32(DoSomething(myArg)); 
} 

private String DoSomething(key) 
{ 
    return SomeList[key]; 
} 

如果非要從SomeList拉數據和具有利用不同的數據類型,然後在每個I必須做類型轉換多種方法。例子可能是會話變量或查詢或表單請求或任何其他數量的事情。

在VB中我可以說

Function myMethod(myArg as String) as Variant 
    myMethod=DoSomething(myArg) 
End Function 

很抱歉,如果原來的職位也不是很清楚。我希望這更有意義。

感謝

+0

你看過'var'嗎?而且你的標題與這個問題的主體並不相符。 – Earlz

+0

你究竟在做什麼?你寫的代碼在VB(它的任何版本)中都是無效的。 –

+0

我在想他想要返回一個變體類型,但我並不真正瞭解 – Earlz

回答

13
public T MyMethod<T>(string myArg) 
{ 
//do work here 
} 

用法

public T MyMethod<T>(string myArg) 
    { 
     return (T)Convert.ChangeType(DoSomething(myArg), typeof(T)); 
    } 

有點過,也許工程;)

+0

你的答案很有趣。我想知道你是否可以用解釋來解釋它。 – Praesagus

+0

這是最好的答案。調用者可以說他們期望從SomeList得到什麼類型,並且您不必爲每種可能類型的myMethod添加個案。 –

+0

完全沒有工程設計。這是要求。你剛剛給出了一個最佳解決方案。代碼+1。 –

7

你不能有兩種方法具有相同的名稱和參數列表,只有返回類型不同。沒門。

8

這是可能的唯一方法是返回一個「對象」引用,然後推斷調用代碼中的類型。正如前面的海報所說,C#函數不能僅僅因返回類型而異。

例如:

private object myMethod(String myArg) 
{  
    if (a == true) 
     return "StringResult"; 
    else if (b == true) 
     return 27; 
    else 
     return 1.4f; 
} 

private void Caller() 
{ 
    object result = myMethod("arg"); 

    if (result is String) 
     // Do string stuff 
    else if (result is Int32) 
     // Do int stuff 
    else if (result is Single) 
     // Do float stuff  
} 
5

要從方法返回不同類型的返回類型都必須在他們的繼承層次結構共享一個共同的類,例如對象。

C#語言規範第4版的「10.6簽名和重載」部分解決了超載問題。相關摘錄如下:

「方法的簽名由方法的名稱,類型參數的數量以及每個形式參數的類型和種類(值,參考或輸出)順序從左到右:方法的簽名特別不包括返回類型,參數名稱或類型參數名稱,也不包括可爲最右側參數指定的參數修飾符。該方法的類型參數,類型參數的序號位置用於類型等同性,而不是類型參數的名稱。「

「方法的重載允許類,結構或接口聲明具有相同名稱的多個方法,前提是它們的簽名在該類,結構或接口中是唯一的。

公共語言基礎結構第4版的「10.2重載」部分也介紹了該主題。相關摘錄:

「CLS規則38:除了名爲op_Implicit和op_Explicit的轉換運算符(它們也可以根據它們的返回類型進行重載)之外,只能根據參數的數目和類型重載屬性和方法。「

3

在VB什麼Variantobject是在C#:

object Foo(int n) { 
    switch (n) { 
    case 1: return 123;  // can return an int 
    case 2: return 123.456; // ... or a double 
    case 3: return "foo"; // ... or a string 
    case 4: return true; // ... or a boolean 
    ... 
    default: return new MyClass(); // ... or anything, really 
} 
2

又一選項,使用out參數呃而不是返回值。

void Foo(string args, out string answer) 
{ 

} 
void Foo(string args, out int answer) 
{ 

} 
+0

我喜歡這個,如果你使用的是舊版本的.NET中沒有泛型這可能是最徹底的方法。 –