2013-10-25 3 views
4

메소드를 액션으로 전달하려고 시도하고 있습니다.하지만 캐스팅은 말할 필요가 없습니다. 액션에 매개 변수로 함수를 전달하십시오.

내가 그 일을하고 어떻게 :

public class RequestHandler<T> where T : struct 
{ 
    public enum EmployeeRequests { BasicDetails, DependentsAndEmergencyContacts , MedicalHistory } 

    protected Dictionary<T, Action> handlers = new Dictionary<T, Action>(); 

    protected EmployeeManagement empMgmnt = new EmployeeManagement(); 

    public void InitializeHandler(int employeeID) 
    { 

     this.AddHandler(EmployeeRequests.BasicDetails,() => empMgmnt.GetEmployeeBasicDetails(0)); 
    } 

    public void AddHandler(T caseValue, Action action) 
    { 
     handlers.Add(caseValue, action); 
    } 

    public void RemoveHandler(T caseValue) 
    { 
     handlers.Remove(caseValue); 
    } 

    public void ExecuteHandler(T actualValue) 
    { 
     ExecuteHandler(actualValue, Enumerable.Empty<T>()); 
    } 

    public void ExecuteHandler(T actualValue, IEnumerable<T> ensureExistence) 
    { 
     foreach(var val in ensureExistence) 
      if (!handlers.ContainsKey(val)) 
       throw new InvalidOperationException("The case " + val.ToString() + " is not handled."); 
     handlers[actualValue](); 
    } 
} 

을 그리고 이것은 내가 매개 변수로 전달하고 제 기능입니다 :

public object GetEmployeeBasicDetails(int employeeID) 
{ 
    return new { First_Name = "Mark", Middle_Initial = "W.", Last_Name = "Rooney"}; 
} 

나는이 오류가 무엇입니까 :

Overloaded method has some invalid arguments.

업데이트

이 내가이 문제를 해결 얻을 관리하는 방법입니다 : Action<T>이 매개 변수 T을 가지고 아무것도 돌려주지해야하기 때문에

public static class RequestHandler 
{ 
    public enum EmployeeRequests { BasicDetails = 0, DependentsAndEmergencyContacts = 1 , MedicalHistory = 2 } 

    private static Dictionary<EmployeeRequests, Func<object>> handlers = new Dictionary<EmployeeRequests, Func<object>>(); 

    public static void InitializeHandler(int employeeID) 
    { 
     Func<object> EmpBasicDetails = delegate { return EmployeeManagement.GetEmployeeBasicDetails(0); }; 
     AddHandler(EmployeeRequests.BasicDetails, EmpBasicDetails); 
    } 

    private static void AddHandler(EmployeeRequests caseValue, Func<object> empBasicAction) 
    { 
     handlers.Add(caseValue, empBasicAction); 
    } 

    public static void RemoveHandler(int caseValue) 
    { 
     var value = (EmployeeRequests)Enum.Parse(typeof(EmployeeRequests), caseValue.ToString()); 
     handlers.Remove(value); 
    } 

    public static object ExecuteHandler(int actualValue) 
    {   
     var request = (EmployeeRequests)Enum.Parse(typeof(EmployeeRequests), actualValue.ToString()); 
     return handlers[(EmployeeRequests)request](); 
    } 
} 
+0

:

당신은 당신의 메소드를 호출하고 출력을 무시 람다를 전달하여이 문제를 해결할 수 있습니까? – SLaks

+0

조치는 특히 void 리턴 유형 및 매개 변수가없는 메소드입니다. 메서드는 객체 반환 형식 및 int 매개 변수를 Action으로 처리 할 수 ​​없습니다. 설정하려고하는 것은 Func 과 일치하는 방법입니다. –

+0

GetEmployeeBasicDetails에서 익명 객체를 반환하면 안됩니다. http://stackoverflow.com/questions/1070526/how-to-return-anonymous-type-from-c-sharp-method-that-uses-linq-to-sql –

답변

4

당신은, Action로 값을 돌려주는 방법을 전달할 수 없습니다 (즉, void). 오류를 얻는 경우

Action empBasicAction =() => GetEmployeeBasicDetails(0); 
+0

여기 [demo on] 링크가 있습니다. ideone] (http://ideone.com/1KA0iU). – dasblinkenlight

+0

좋아요, 작동하도록 코드가 있지만 실행하는 액션에서 개체를 반환하고 싶습니다. 'object obj = empBasicAction();과 비슷한 것 – faizanjehangir

+2

@faizanjehangir 그런 다음'Action'을'Func '으로 대체해야합니다. 나머지 코드는 그대로 유지됩니다. – dasblinkenlight

관련 문제