将带有参数的函数作为参数传递,并返回泛型类型



在下面的代码中,我试图将函数func传递给GetData函数。这将获取阅读器对象并将其映射到一个通用对象。

我希望向GetData传递一个对象类型以及一个将数据映射到该对象类型的函数,这样我就不必重复打开/关闭/处理连接。

这可能吗?或者有人有其他建议吗?

public T GetData<T>(string cmdText,Func<T> func)
{
using (SqlConnection conn = new SqlConnection(connectionStringBuilder.ConnectionString))
{
using (SqlCommand cmd = new SqlCommand(cmdText, conn))
{
SqlDataReader reader = cmd.ExecuteReader();
//return func(reader);
//  WITHIN THE FUNC FUNCTION:
//  while (reader.Read())
//  {
//  Map function to T e.g
//  T.property = reader["column"];
//  Return T
//  }
}
}
}

您要查找的签名是:

T GetData<T>(string cmdText, Func<SqlDataReader, T> func)

然后你可以继续写你的函数如下:

public T GetData<T>(string cmdText, Func<SqlDataReader, T> func)
{
using (var conn = new SqlConnection(connectionStringBuilder.ConnectionString))
{
using (var cmd = new SqlCommand(cmdText, conn))
{
var reader = cmd.ExecuteReader();
return func(reader);
}
}
}

你会这样使用它:

var result = GetData("select * from Foo", dr =>
{
while (dr.Read())
{
return new { property = dr["column"] };
}
throw new DataException();
});

现在,这是基于你说你想在你的问题中使用它的方式。

但是,在拆分实现时,您对函数的使用有点困难——部分在GetData中,部分在调用代码中。

你最好使用这个签名:

IEnumerable<T> GetData<T>(string cmdText, Func<SqlDataReader, T> func)

现在你可以写这样的方法:

public IEnumerable<T> GetData<T>(string cmdText, Func<SqlDataReader, T> func)
{
using (var conn = new SqlConnection(connectionStringBuilder.ConnectionString))
{
using (var cmd = new SqlCommand(cmdText, conn))
{
var reader = cmd.ExecuteReader();
while (reader.Read())
{
yield return func(reader);
}
}
}
}

现在的优点是调用代码要简单得多:

var results = GetData("select * from Foo", dr => new { property = dr["column"] });

这将返回与查询返回的数据行数一样多的数据行。

如果您知道您的调用代码只返回一个值,那么您可以在方法调用的末尾丢弃一个.Single(),以确保您只得到一个结果。

相关内容

  • 没有找到相关文章

最新更新