2013-10-04 5 views
1

최근에 C#을 직접 살펴 보았습니다. 그러나이 문제에 갇혔다.C# 동작 <T> 익명 메서드로 처리하는 방법

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);과 :

그래서 나는 방법 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); 

또 다른 방법이있다. 오류는 "delcmd가 현재 컨텍스트에 없습니다"입니다. 익명 메서드를 매개 변수로 다른 메서드에 전달하는 방법?

+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

람다식이 될 것입니다. – maxspan

1

오타가 있습니다. delcmd 대신 delCmd이어야합니다. C#은 대소 문자를 구별하는 언어입니다

업데이트 : DelCmdAction<OleDbCommand>과 같지 않습니다. 즉, 다른 유형이며 서로를 위임 할 수도 없습니다. 그러나 새로운 작업 대리자를 만들 수 있습니다.

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

오, 죄송합니다. 그것은 실제로 delCmd였습니다. 그리고 오류 "대부분의 오버로드 된 메서드 ... dbExec (System.Action user2846723

+1

대리자를 다른 대리자로 변환하는 대신 사용자 지정 대리자 정의를 제거하고 익명 대리자를 할당합니다. 시작부터 '행동'권한으로 이동하십시오. – Servy