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はさまざまなタイプにすることもできます(主にstringと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

リターンタイプを決定するロジックがメソッドの内部にある場合、ジェネリックメソッドを呼び出すときにリターンタイプを指定できる必要があるため、ジェネリックリターンタイプは役に立ちません。戻り型をに変更しList<object>、メソッドが戻った後に具象型へのキャストバックを処理できます。それは醜いですが、それは動作します。

呼び出し元がメソッドを呼び出すときに予期するタイプを知っている場合は、その方法でジェネリックに変更List<int>してサポートすることができます。List<T>

于 2012-08-20T18:38:29.137 に答える
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 に答える
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 に答える