2013-10-04 55 views
1

我最近探索了C#給自己。但堅持這個問題。c#動作<T>如何使用匿名方法處理

所以我有一個方法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聲明的參數將匿名方法作爲參數傳遞給另一個方法?

+3

這是因爲大寫'C'很重要:)'delcmd'應該是'delCmd'。 – dasblinkenlight

回答

4

您也可以避免完全定義委託。

像這樣:

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在對方的回答的評論中寫道,但他形容它的方式更好。

+0

這將是一個Lambda表達式。 – maxspan

1

您有一個錯字 - 它應該是delCmd而不是delcmd。 C#是區分大小寫的語言

更新:DelCmdAction<OleDbCommand>不一樣 - 這是不同的類型,而且您甚至不能相互投射代表。但您可以創建新的動作代理:

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

哦,對不起。它實際上是delCmd。錯誤是「最重載的方法... dbExec(System.Action user2846723

+1

而不是將一個委託轉換爲另一個委託只是刪除自定義委託定義並分配匿名委託從一開始就到一個「行動」權利 – Servy