我有一个方法需要根据搜索返回不同的数据类型.我正在考虑两种方法,因为我是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发布?
第一种方法甚至不可能.只能通过更改返回类型来重载方法.
根据什么代码确实,你可以使它通用:
public T Get<T>(string name){
//...
return somegenericvalue;
}
Run Code Online (Sandbox Code Playgroud)
但我怀疑你无论如何都要使用反射来决定做什么,因此泛型的优势将被否定.另外,您不能限制它只是你所提到的类型(string,int,double)
按类型使用不同方法的主要好处是强类型.对于消费者而言,受支持类型的列表是有限的,因此他们不必担心该Get方法是否支持特定类型.对于编写者,您可以编写该特定类型的代码.所以你不需要反射,类型检查,转换,解析等是通用的 - 你可以只编写那种类型的代码.
它可能感觉像冗余代码,但您仍然可以重构将常见的部分放入内部"帮助程序"方法.
仅供参考框架在某些地方实现这一点,所以它并非闻所未闻:
另一方面,有一些扩展方法可以选择使用泛型方法:
但这些通常只是pass_through方法,它们不做任何需要特定类型代码的转换.
您可以使用元组(我不喜欢 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)