如何从方法返回可变数据类型

时间:2009-11-30 22:33:05

标签: c# asp.net

我有一个方法,其调用者需要不同的数据类型。我可以通过将它们放入每个调用者中来重复必要的转换十几次,但在被调用的方法中执行它一次效率似乎更高效。

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中提取数据并且必须使用不同的数据类型,那么我必须在每个方法中进行类型转换。示例可以是会话变量或查询或表单请求或任何其他数量的事物。

在VB中,我可以说

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

很抱歉,如果原帖不是很清楚。我希望这更有意义。

由于

6 个答案:

答案 0 :(得分:13)

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

<强> USAGE

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

有点过度设计可能;)

答案 1 :(得分: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     
}

答案 2 :(得分:7)

您不能有两个具有相同名称和参数列表的方法,只有不同的返回类型。没办法。

答案 3 :(得分:5)

要从方法返回不同的类型,返回类型必须在其继承层次结构中共享一个公共类,例如object。

C#语言规范第4版的“10.6签名和重载”部分解决了重载问题。相关摘录:

“方法的签名包括方法的名称,类型参数的数量,以及每个形式参数的类型和种类(值,引用或输出),按顺序考虑从左到右。方法的签名特别不包括返回类型,参数名称或类型参数名称,也不包括可以为最右侧参数指定的params修饰符。当参数类型包含类型时方法的参数,类型参数的序号位置用于类型等价,而不是类型参数的名称。“

“重载方法允许类,结构或接口声明具有相同名称的多个方法,前提是它们的签名在该类,结构或接口中是唯一的。”

Common Language Infrastructure第4版的“10.2 Overloading”部分也涉及该主题。相关摘录:

“CLS规则38:属性和方法可以被重载只基于除了名为op_Implicit和op_Explicit的转换运算符,其也可以基于它们的返回类型超载的数量和类型的参数的,” < / em>的

答案 4 :(得分:3)

VB中Variant是什么,object位于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
}

答案 5 :(得分:2)

又一个选项,使用out参数而不是返回值。

void Foo(string args, out string answer)
{

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

}