c# Action如何使用匿名方法进行处理

本文关键字:方法 处理 何使用 Action | 更新日期: 2023-09-27 18:33:59

我最近对自己进行了探索。但坚持这个问题。

所以我有一个方法 dbExec

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

委托

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 参数的方法?

c# Action<T>如何使用匿名方法进行处理

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

喜欢这个:

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

你有一个错字 - 它应该是delCmd而不是delcmd.C# 是一种区分大小写的语言

更新:DelCmdAction<OleDbCommand>不同 - 这是不同的类型,您甚至不能相互投射委托。但您可以创建新的操作委托:

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