如何从C#方法返回多种数据类型?

geo*_*e b 4 c# types casting

我有一个方法需要根据搜索返回不同的数据类型.我正在考虑两种方法,因为我是C#的新手,我不知道哪种方法最好,所以请帮我弄清楚.

第一种方法是重载这样的方法:

public int Get(string name){
   //...
   return intValue;
}

public double Get(string name){
   //...
   return doubleValue;
}

public string Get(string name){
   //...
   return stringValue;
}
Run Code Online (Sandbox Code Playgroud)

第二种方法是为每种数据类型设置不同的方法,如下所示:

public int GetInt(string name){
   //...
   return intValue;
}

public double GetDouble(string name){
   //...
   return doubleValue;
}

public string GetString(string name){
   //...
   return stringValue;
}
Run Code Online (Sandbox Code Playgroud)

哪一个是C#最安全的,考虑到这个代码将从DLL发布?

D S*_*ley 9

第一种方法甚至不可能.只能通过更改返回类型来重载方法.

根据什么代码确实,你可以使它通用:

public T Get<T>(string name){
   //...
   return somegenericvalue;
}
Run Code Online (Sandbox Code Playgroud)

但我怀疑你无论如何都要使用反射来决定做什么,因此泛型的优势将被否定.另外,您不能限制它只是你所提到的类型(string,int,double)

按类型使用不同方法的主要好处是强类型.对于消费者而言,受支持类型的列表是有限的,因此他们不必担心该Get方法是否支持特定类型.对于编写者,您可以编写该特定类型的代码.所以你不需要反射,类型检查,转换,解析等是通用的 - 你可以只编写那种类型的代码.

它可能感觉像冗余代码,但您仍然可以重构将常见的部分放入内部"帮助程序"方法.

仅供参考框架在某些地方实现这一点,所以它并非闻所未闻:

另一方面,有一些扩展方法可以选择使用泛型方法:

但这些通常只是pass_through方法,它们不做任何需要特定类型代码的转换.


Sta*_*ked 5

您可以使用元组(我不喜欢 ItemX 的东西,但仍然是一个选项)。假设您需要一个方法来返回一个人对象、一个字符串和一个数字。然后,您可以简单地编写以下代码:

public static Tuple<Person, string, int> GetMyData()
{
    var person = GetPerson();
    var text = "Hello";
    var number = 2016;

    var result = Tuple.Create(person, text, number);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

调用该方法并访问返回的数据如下:

var data = GetMyData();
data.Item1; // person
data.Item2; // text
data.Item3; // number
Run Code Online (Sandbox Code Playgroud)

在您的情况下,我会使用一个参数来指示要搜索的类型。

public Tuple<int, double, string> Search(searchPattern)
{
    if (serachPattern == "double")
    {
        double myDouble = SearchDouble();
        return Tuple.Create(0, myDouble, null);
    }

    // Handle other patterns here
}
Run Code Online (Sandbox Code Playgroud)

用法:

var myDouble = Search("double").Item2;
var myString = Search("string").Item3;
var myInt = Search("int").Item1;
Run Code Online (Sandbox Code Playgroud)