我正在尝试创建一个将使用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不可使用的成员“列表”不能像 方法。
我假设这里有一个语法问题,它使我发疯。有什么建议么?
答案 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);
}
}
}
}
那么我们要做的就是提供参数:connectionString
,commandText
和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;
});
}