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

缺口

在下面的代码中,我试图将一个函数传递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 ,以确保获得一个且只有一个结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将带有2个参数的函数作为参数传递给函数?

来自分类Dev

如何或可以将带有参数作为参数的函数传递给lua中的函数?

来自分类Dev

传递带有参数作为参数的函数

来自分类Dev

Python C API:将带有特殊类型的许多参数的两个函数作为模块传递

来自分类Dev

在Swift中将带有多个参数的函数作为闭包传递

来自分类Dev

Python:将带有参数的函数传递给函数

来自分类Dev

Python:将带有参数的函数传递给函数

来自分类Dev

如何将带有参数作为参数的函数传递给Python中的另一个函数?

来自分类Dev

将带有参数的函数传递给事件处理程序

来自分类Dev

Bash:将带有引号的参数传递给函数

来自分类Dev

当值类型作为带有接口约束的通用参数传递时是否装箱?

来自分类Dev

创建带有参数返回类型的函数

来自分类Dev

在PowerShell中将函数(带有参数)作为参数传递

来自分类Dev

通用方法返回类型作为类型参数

来自分类Dev

是否可以将带有参数的游标作为过程的参数传递?

来自分类Dev

有没有一种方法可以将带有任何类型和数量的参数的void函数作为方法的参数传递并将其存储在数据成员中?(C ++)

来自分类Dev

将带有 ">=" 的参数传递给 argparse

来自分类Dev

C ++:将lambda作为带有模板参数的函数进行传递会使推导模板类型失败

来自分类Dev

如何将带有设置参数的通用Powershell函数包装到新的指定函数中?

来自分类Dev

将带有空格的选项/参数/参数从脚本传递到其中的函数

来自分类Dev

将带有查询参数的URL传递为JavaScript中的函数参数

来自分类Dev

传递代表(带有参数)作为参数

来自分类Dev

反应。如何传递带有参数的函数作为道具?

来自分类Dev

如何将带有参数的参数传递给gulp?

来自分类Dev

将带有“ ::”作为参数的令牌传递给C / C ++宏

来自分类Dev

如何将带有%20的文件路径作为参数传递给进程?

来自分类Dev

是否可以将带有vars的json对象作为angularjs指令参数传递?

来自分类Dev

将带有空格的路径作为参数传递给批处理文件

来自分类Dev

将带有破折号的字符串作为参数传递给Trollop

Related 相关文章

  1. 1

    如何将带有2个参数的函数作为参数传递给函数?

  2. 2

    如何或可以将带有参数作为参数的函数传递给lua中的函数?

  3. 3

    传递带有参数作为参数的函数

  4. 4

    Python C API:将带有特殊类型的许多参数的两个函数作为模块传递

  5. 5

    在Swift中将带有多个参数的函数作为闭包传递

  6. 6

    Python:将带有参数的函数传递给函数

  7. 7

    Python:将带有参数的函数传递给函数

  8. 8

    如何将带有参数作为参数的函数传递给Python中的另一个函数?

  9. 9

    将带有参数的函数传递给事件处理程序

  10. 10

    Bash:将带有引号的参数传递给函数

  11. 11

    当值类型作为带有接口约束的通用参数传递时是否装箱?

  12. 12

    创建带有参数返回类型的函数

  13. 13

    在PowerShell中将函数(带有参数)作为参数传递

  14. 14

    通用方法返回类型作为类型参数

  15. 15

    是否可以将带有参数的游标作为过程的参数传递?

  16. 16

    有没有一种方法可以将带有任何类型和数量的参数的void函数作为方法的参数传递并将其存储在数据成员中?(C ++)

  17. 17

    将带有 ">=" 的参数传递给 argparse

  18. 18

    C ++:将lambda作为带有模板参数的函数进行传递会使推导模板类型失败

  19. 19

    如何将带有设置参数的通用Powershell函数包装到新的指定函数中?

  20. 20

    将带有空格的选项/参数/参数从脚本传递到其中的函数

  21. 21

    将带有查询参数的URL传递为JavaScript中的函数参数

  22. 22

    传递代表(带有参数)作为参数

  23. 23

    反应。如何传递带有参数的函数作为道具?

  24. 24

    如何将带有参数的参数传递给gulp?

  25. 25

    将带有“ ::”作为参数的令牌传递给C / C ++宏

  26. 26

    如何将带有%20的文件路径作为参数传递给进程?

  27. 27

    是否可以将带有vars的json对象作为angularjs指令参数传递?

  28. 28

    将带有空格的路径作为参数传递给批处理文件

  29. 29

    将带有破折号的字符串作为参数传递给Trollop

热门标签

归档