c# - 传递带参数的函数,作为参数并返回泛型类型
问题描述
在下面的代码中,我试图将一个函数传递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()
在方法调用的末尾删除 a 以确保您得到一个且只有一个结果。
推荐阅读
- python-3.x - 演讲者语音的 Python Speech-to-Text 翻译
- dataweave - Mule 4 : 属性文件 : 对于对 Mule 4 应用程序的每个请求,是否建议重复从属性文件中读取项目?
- javascript - 道具未捕获类型错误:无法读取未定义的属性“名称”
- google-cloud-platform - Cloud SQL 代理 - 消息:权限不足
- android - 从 Android 模拟器连接到本地 asp.net Web 服务器
- pytorch - 使用不同长度的批次进行 PyTorch 训练?
- c++ - 如何在 C++ 中存储一组整数值
- perforce - Perforce&Swarm:提交更改后文件从工作区中删除
- arduino - 如何使用 Google Drive REST API v3 执行分段上传
- javascript - 从 node.js 应用程序到达 gmail 时,长链接被破坏