【问题标题】:c# Action<T> How to handle with anonymous methodsc# Action<T> 如何处理匿名方法
【发布时间】:2013-10-11 12:33:31
【问题描述】:

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

所以我有一个方法 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 很重要 :) delcmd 应该是 delCmd

标签: c# lambda delegates action anonymous-methods


【解决方案1】:

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

像这样:

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

【讨论】:

  • 这将是一个 Lambda 表达式。
【解决方案2】:

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

更新:DelCmdAction&lt;OleDbCommand&gt; 不同 - 那是不同的类型,您甚至不能将代表相互转换。但是您可以创建新的操作委托:

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

【讨论】:

  • 哦,对不起。它实际上是 delCmd。并且错误是“...dbExec(System.Action
  • 与其将一个委托转换为另一个委托,不如从一开始就删除自定义委托定义并将匿名委托分配给Action
猜你喜欢
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 2023-03-15
  • 2021-12-04
相关资源
最近更新 更多