如何在C#中执行功能参数

时间:2019-03-15 09:42:46

标签: c# .net

我正在尝试创建一个将使用Func参数的泛型方法。

传统功能是我们创建methodOne()并将其作为参数发送给另一种方法。但是,这将使我尝试创建为泛型的方法的目的失效。

我的代码:

public static List<T> ExecuteQuery<T>(string connection, 
                                      string commandText, 
                                      Func<SqlDataReader, List<T>> myMethodName)
{
    List<T> items = new List<T>();
    SqlDataReader sqlDataReader = null;

    try
    {
        using (SqlConnection con = new SqlConnection(connection))
        {
            using (SqlCommand cmd = new SqlCommand(commandText, con))
            {
                try
                {
                    con.Open();
                    sqlDataReader = cmd.ExecuteReader();

                    items = myMethodName(sqlDataReader);
                }
                catch (Exception ex)
                {
                    if (sqlDataReader != null) sqlDataReader.Close();

                    cmd.Dispose();

                    throw ex;
                }
                finally
                {
                    if (sqlDataReader != null) sqlDataReader.Dispose();

                    cmd.Dispose();
                }
            }
        }
    }
    catch (Exception)
    {
        throw;
    }

    return items;
}

尝试这样调用上面的方法

    public List<Function> GetDeletedFunctions(string connectionString)
    {
        SqlDataReader sqlDataReader = null;
        List<Function> functions;

        string cmdText = @"SELECT * FROM Table "; // dumy query

        functions = DbHelper.ExecuteQuery<Function>(
          connectionString, 
          cmdText, 
          List<Function>(sqlDataReader)
        {

            var f =
            (from x in sqlDataReader.Cast<DbDataRecord>()
             select new Function
             {
                 Param1 = DbHelper.GetValue<string>("Param1 ", x),
                 Param2 = DbHelper.GetValue<string>("Param2", x),
             }).ToList();

            return f;
        } );
}

编译时错误:

  

错误CS1955不可使用的成员“列表”不能像   方法。

我假设这里有一个语法问题,它使我发疯。有什么建议么?

2 个答案:

答案 0 :(得分:2)

当包装到using中时,您不必捕获异常(.Net将为您释放资源,如雨后春笋般出现)

// Dangerous practice: what if I put commandText "drop table MyTable"?
public static List<T> ExecuteQuery<T>(string connection, 
                                      string commandText, 
                                      Func<SqlDataReader, List<T>> myMethodName) {
  //ToDo: Validate parameters here

  using (var con = new SqlConnection(connection)) {
    con.Open();

    using (var cmd = new SqlCommand(commandText, con)) {
      // IDataReader is IDisposable as well       
      using (var reader = cmd.ExecuteReader()) {
        return myMethodName(reader);
      } 
    }
  }  
}

那么我们要做的就是提供参数:connectionStringcommandText和map函数;让我们做吧:

public List<Function> GetDeletedFunctions(string connectionString) {
  //TODO: Validate connectionString here 

  return DbHelper.ExecuteQuery<Function>(
     connectionString,                                // Connection String
   @"SELECT * FROM Table ",                           // Query
    (reader) => {                                     // Map function
       // When given reader, the map function creates list
       List<Function> result = new List<Function>();

       // Convert each record into Function instance and add them into the list
       while (reader.Read()) {
         Function item = new Function() {
           Param1 = Convert.ToString(reader["Param1"]),
           Param2 = Convert.ToString(reader["Param2"]),
         }

         result.Add(item); 
       }

       // and return the list
       return result;
    }
  )
}

答案 1 :(得分:1)

您尝试将函数作为参数传递的方式存在问题。请使用以下代码:

public List<Function> GetDeletedFunctions(string connectionString)
{                        
    string cmdText = @"SELECT * FROM Table "; // dumy query
    return DbHelper.ExecuteQuery<Function>(connectionString,
                                           cmdText,
                                           (SqlDataReader sqlDataReader) =>
                                           {
                                               var f = (from x in sqlDataReader.Cast<DbDataRecord>()
                                               select new Function
                                               {
                                                   Param1 = DbHelper.GetValue<string>("Param1 ", x),
                                                   Param2 = DbHelper.GetValue<string>("Param2", x)
                                               }).ToList();

                                               return f;
                                           });
}