如何获取作为func传递的匿名方法的参数值?

时间:2016-09-30 11:17:32

标签: c# generics lambda system.reflection

我在远程系统上调用方法。远程系统实现了两个系统都具有(通过共享nuget存储库)副本的接口。目前我发送的请求是这样的:

var oldRequest = new FooRequest("GetEmployeeById", new object[] { "myPartner", 42, DateTime.Now.AddDays(-1) });

这是界面:

public class FooResponse<T> { }

public interface IFooController
{
    FooResponse<string> GetEmployeeById(string partnerName, int employeeId, DateTime? ifModifiedSince);
}

正如您可以映像一样,有时程序员会以错误的顺序将参数传递给构造函数中的数组,并且事情开始失败。为了解决这个问题,我创建了以下代码,以便在创建FooRequest时支持intellisense:

public static FooRequest Create<T>(Func<FooResponse<T>> func)
{
    return new FooRequest(null, null); // Here goes some magic reflection stuff instead of null.
}

现在可以像这样创建一个FooRequest

public static IFooController iFooController => (IFooController)new object();
public static FooRequest CreateRequest<T>(Func<FooResponse<T>> func)
{
    return FooRequest.Create(func);
}

var newRequest = CreateRequest(() => iFooController.GetEmployeeById("myPartner", 42, DateTime.Now.AddDays(-1)));

我的问题是:我如何能够在FooRequest.Create - 方法中获取方法的名称和参数的值?

我已经用尽了我的反思和谷歌技能试图找到价值观,但到目前为止还没有运气。

如果有人想要试一试,可以在这里找到完整的编译代码:http://ideone.com/ovWseI

1 个答案:

答案 0 :(得分:2)

以下是如何使用表达式执行此操作的草图:

    let params = ["fields" : "email, name"]
    let graphRequest = GraphRequest(graphPath: "me", parameters: params)
    graphRequest.start {
        (urlResponse, requestResult) in

        switch requestResult {
        case .failed(let error):
            print("error in graph request:", error)
            break
        case .success(let graphResponse):
            if let responseDictionary = graphResponse.dictionaryValue {
                print(responseDictionary)

                print(responseDictionary["name"])
                print(responseDictionary["email"])
            }
        }
    }