2013-10-04 1 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; 
} 

Edit: я на самом деле имею в виду то, что написал Servy в комментарии на другой ответ, но он описал это способ лучше.

+0

Это будет выражение Lambda. – maxspan

1

У вас есть опечатка - это должно быть delCmd вместо delcmd. C# - регистр с учетом регистра

UPDATE: DelCmd не такой, как Action<OleDbCommand> - это разные типы, и вы даже не можете передавать делегатов друг другу. Но вы можете создать делегата нового действия:

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

О, извините. Это было на самом деле delCmd. И ошибка - это «самый перегруженный метод для ... dbExec (System.Action user2846723

+1

Вместо того, чтобы преобразовывать один делегат в другой, просто удалите пользовательское определение делегата и назначьте анонимный делегат с 'Action' с самого начала. – Servy

Смежные вопросы