2013-10-25 62 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.

UPDATE

這是我如何管理來解決這個問題:

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

一個Action特別是具有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,因爲Action<T>必須採取參數T和返回任何結果(即void)。

您可以解決此通過傳遞調用你的方法,而忽略它的輸出拉姆達:你在哪裏得到的錯誤

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

這裏是一個[演示ideone](http://ideone.com/1KA0iU)。 – dasblinkenlight

+0

好吧,我已經獲得了可以工作的代碼,但是我想從執行的操作中返回一個對象。類似於object obj = empBasicAction();' – faizanjehangir

+2

@faizanjehangir然後你需要用'Func '替換'Action'。其餘的代碼將保持不變。 – dasblinkenlight

相關問題