c# Action<T> 如何处理匿名方法

标签 c# lambda delegates action anonymous-methods

我最近自己探索了 C#。但是遇到了这个问题。

所以我有一个方法 dbExec

public void dbExec(Action<OleDbCommand> func)
{
    using (var conn = new OleDbConnection(connStr))
    {
        conn.Open();
        var cmd = conn.CreateCommand();
        func(cmd); 
    }
}

委托(delegate),

public delegate void DelCmd(OleDbCommand cmd);

还有另一种方法:

public ICollection<string> CheckUserPermissions() 
{
    List<string> logins = new List<string>();
    DelCmd delCmd = delegate(OleDbCommand cmd)
    {
        cmd.CommandText = "SELECT PERMISSIONS.LOGIN FROM PERMISSIONS";
        using (var rdr = cmd.ExecuteReader()) while (rdr.Read()) logins.Add(rdr["LOGIN"].ToString());  
    };
    dbExec(delcmd);
    return logins;
} 

dbExec(delcmd); 语句的问题。错误是“delcmd 在当前上下文中不存在”。如何将匿名方法作为参数传递给另一个带有 Action 声明参数的方法?

最佳答案

您也可以完全避免定义委托(delegate)。

像这样:

public ICollection<string> CheckUserPermissions()
{
    List<string> logins = new List<string>();

    Action<OleDbCommand> delCmd = cmd => 
    {
        cmd.CommandText = "SELECT PERMISSIONS.LOGIN FROM PERMISSIONS";
        using (var rdr = cmd.ExecuteReader()) 
            while (rdr.Read()) logins.Add(rdr["LOGIN"].ToString());
    };
    dbExec(delCmd);
    return logins;
}

编辑:我实际上是指 Servy 在对另一个答案的评论中写的内容,但他描述得更好。

关于c# Action<T> 如何处理匿名方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19182432/

相关文章:

c# - 如何定义运算符==

c++ - FastDelegate 和 lambdas - 无法让它们工作(Don Clugston 最快的委托(delegate))

c++ - 使用引用作为通用参数从通用 lambda 创建线程

c# - 无法使扩展方法在委托(delegate)上工作

ios - 动画播放与否取决于链接动画的 animationRepeatCount

c# - itextsharp 在表格单元格中的圆形图像上添加文本

c# - 图像缩放后我如何更新滚动查看器?

c# - 多线程、lambdas 和局部变量

c++ - 从输入容器/迭代器推导 lambda 参数类型

iOS/Swift - 闭包/完成 block 和委托(delegate)/函数之间有什么区别?