簡體   English   中英

如何獲取作為 func 傳遞的匿名方法的參數值?

[英]How can i get the parameter values of an anonymous method passed as a func?

我正在調用遠程系統上的方法。 遠程系統實現了一個接口,兩個系統都有一個副本(通過共享的 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時提供智能感知支持:

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方法中獲得方法的名稱和參數的值?

我已經用盡了我的思考和 google-skills 試圖找到這些值,但到目前為止還沒有運氣。

如果有人想試一試,可以在這里找到完整的編譯代碼: http : //ideone.com/ovWseI

這是如何使用表達式執行此操作的草圖:

public class Test {
    public static IFooController iFooController => (IFooController) new object();

    public static FooRequest CreateRequest<T>(Expression<Func<FooResponse<T>>> func) {
        return FooRequest.Create(func);
    }

    public static void Main() {
        var newRequest = CreateRequest(() => iFooController.GetEmployeeById("myPartner", 42, DateTime.Now.AddDays(-1)));
        Console.ReadKey();
    }
}

public class FooRequest {
    public static FooRequest Create<T>(Expression<Func<FooResponse<T>>> func) {
        var call = (MethodCallExpression) func.Body;
        var arguments = new List<object>();
        foreach (var arg in call.Arguments) {
            var constant = arg as ConstantExpression;
            if (constant != null) {
                arguments.Add(constant.Value);
            }
            else {
                var evaled = Expression.Lambda(arg).Compile().DynamicInvoke();
                arguments.Add(evaled);
            }
        }
        return new FooRequest(call.Method.Name, arguments.ToArray());
    }

    public FooRequest(string function, object[] data = null) {
        //SendRequestToServiceBus(function, data);
        Console.Write($"Function name: {function}");
    }
}

public class FooResponse<T> {
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM