C# c Action如何处理匿名方法

C# c Action如何处理匿名方法,c#,lambda,delegates,action,anonymous-methods,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); } } 还有另一种方法: pu

我最近自学了c语言。但我一直在解决这个问题

所以我有一个方法dbExec

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

dbExecdelcmd的问题;陈述错误是delcmd在当前上下文中不存在。如何将一个匿名方法作为参数传递给另一个声明了Action参数的方法

您有一个输入错误-应该是delCmd而不是delCmd。C是一种区分大小写的语言

更新:DelCmd和Action不一样-这是不同的类型,而且你们甚至不能将委托彼此强制转换。但您可以创建新的操作委托:

dbExec(new Action<OleDbCommand>(delCmd));

您有一个输入错误-它应该是delCmd而不是delCmd。C是一种区分大小写的语言

更新:DelCmd和Action不一样-这是不同的类型,而且你们甚至不能将委托彼此强制转换。但您可以创建新的操作委托:

dbExec(new Action<OleDbCommand>(delCmd));

您还可以避免完全定义委托

像这样:

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在对另一个答案的评论中所写的内容,但他描述得更好。

您也可以完全避免定义委托

像这样:

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很重要:delcmd应该是delcmd。这是因为大写字母C很重要:delcmd应该是delcmd。哦,对不起。实际上是delCmd。error是…dbExecSystem.Action最重载的方法,而不是将一个委托转换为另一个委托,只需删除自定义委托定义,并从一开始就将匿名委托分配给操作。哦,抱歉。实际上是delCmd。error是…dbExecSystem.Action最重载的方法,而不是将一个委托转换为另一个委托,只需删除自定义委托定义并从一开始就将匿名委托分配给操作。这将是一个Lambda表达式。这将是一个Lambda表达式。