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"};
}

このエラーが発生しています:

オーバーロードされたメソッドに無効な引数があります。

アップデート

これは私がこれを回避する方法です:

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]();
    }
}
4

1 に答える 1

5

値を返すメソッドを として渡すことはできません。これは、 はパラメーターを取り、何も返さない (つまり) 必要があるActionためです。Action<T>Tvoid

メソッドを呼び出してその出力を無視するラムダを渡すことで、これを回避できます。

Action empBasicAction = () => GetEmployeeBasicDetails(0);
于 2013-10-25T14:13:13.913 に答える