我能让这个方法返回泛型返回类型吗?

时间:2012-08-20 18:35:06

标签: c# generics

我可以将此方法设为通用吗?

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

4 个答案:

答案 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 必须确定订单号的类型,则不能使用泛型。