2009-11-30 32 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中没有泛型这可能是最彻底的方法。 –