1

我可以使这种方法通用吗?

  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 也可以是多种类型(主要是字符串和 int)

4

4 回答 4

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;
}
于 2012-08-20T18:37:50.433 回答
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;
   }
于 2012-08-20T18:41:24.213 回答
2

如果确定返回类型的逻辑在方法内部,那么泛型返回类型将无济于事,因为您需要能够在调用泛型方法时指定返回类型。您可以将返回类型更改为List<object>,然后在方法返回后处理转换回具体类型。这很丑陋,但它有效。

如果调用者知道调用方法时期望什么类型,您可以简单地更改List<int>List<T>并支持泛型。

于 2012-08-20T18:38:29.137 回答
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方法必须确定订单号的类型,则不能使用泛型。

于 2012-08-20T18:38:20.497 回答