我可以将此方法设为通用吗?
public static List<int> GetUnshippedOrders(string server,string port,string database,string username,string password, string orderStatus)
{
var orderNumbers = new List<int>();
using (var conn = ConnectToMySql(server, port, database, username, password))
{
var command = new MySqlCommand("SELECT OrderNumber FROM orders WHERE OrderStatus = @orderStatus;", conn);
command.Parameters.AddWithValue("@orderStatus", orderStatus);
var reader = command.ExecuteReader();
while (reader.Read())
{
orderNumbers.Add(Convert.ToInt32(reader[0]));
}
}
return orderNumbers;
}
我希望能够处理各种返回类型,因为引用的订单号将根据所连接数据库的模式而改变,我宁愿不必为每种可能的返回类型重载此方法(加上我想学习泛型)。
数据库架构由各种Web服务决定,这些都不在我的控制之下。 另外值得注意的是,orderStatus也可以是各种类型(主要是字符串和整数)
答案 0 :(得分:3)
也许是这样的:
public static List<T> GetUnshippedOrders<T>(string server,string port,string database,string username,string password, string orderStatus) where T : class
{
var orderNumbers = new List<T>();
using (var conn = ConnectToMySql(server, port, database, username, password))
{
var command = new MySqlCommand("SELECT OrderNumber FROM orders WHERE OrderStatus = @orderStatus;", conn);
command.Parameters.AddWithValue("@orderStatus", orderStatus);
var reader = command.ExecuteReader();
while (reader.Read())
{
orderNumbers.Add((T)(reader[0]));
}
}
return orderNumbers;
}
答案 1 :(得分:2)
如果确定返回类型的逻辑是方法的内部,则泛型返回类型不会有帮助,因为您需要能够在调用泛型方法时指定返回类型。您可以将返回类型更改为List<object>
,然后在方法返回后处理返回到具体类型。这很难看,但它确实有效。
如果调用者知道在调用方法时期望的类型,您只需将List<int>
更改为List<T>
并以这种方式支持泛型。
答案 2 :(得分:2)
这样的事情(不要忘记使用):
public static List<T> GetUnshippedOrders<T>(string server,string port,string database,string username,string password, string orderStatus, Func<IDataReader, T> factoryMethod)
{
var results = new List<T>();
using (var conn = ConnectToMySql(server, port, database, username, password))
{
using (var command = new MySqlCommand("SELECT OrderNumber FROM orders WHERE OrderStatus = @orderStatus;", conn))
{
command.Parameters.AddWithValue("@orderStatus", orderStatus);
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
results.Add(factoryMethod(reader));
}
}
}
}
return results;
}
答案 3 :(得分:0)
如果来电者知道返回类型
如果来电者知道订单号可以预期的类型,您可以将定义更改为
public static List<T> GetUnshippedOrders<T>(string server,string port,string database,string username,string password, string orderStatus)
用法:
List<int> orderNumbers = GetUnshippedOrders<int>(...);
如果方法知道返回类型
如果方法 GetUnshippedOrders 必须确定订单号的类型,则不能使用泛型。