簡體   English   中英

如何在c#中確定匿名函數參數?

[英]How to determine anonymous function parameters in c#?

鑒於以下代碼,

    public T Execute<T>(Func<T> methodParam)
    {
        return methodParam ();
    }

    public void CallMethodsAnonymously<T>()
    {
        T result =  Execute(() => _service.SomeMethod1());
        T result1 = Execute(() => _service.SomeMethod2(someParm1));
        T result2 = Execute(() => _service.SomeMethod3( someParm1, someParm2));
    }

從Execute方法,是否可以檢查“methodParam”並提取或確定匿名函數體內的參數數量? 例如,是否可以從Execute方法中確定someParam1和someParam2的值?

您可以使用Expression API執行此操作:

public static T Execute<T>(Expression<Func<T>> methodParam)
{
    var methodCallExpression = methodParam.Body as MethodCallExpression;
    var method = methodCallExpression.Method;
    var parameters = method.GetParameters();

    return methodParam.Compile()();
}

參數變量將是一個ParameterInfo對象數組,它將包含您需要的信息。 最后,Compile方法實際上將Expression轉換為可執行委托。 C#編譯器還允許您使用標准lambdas / anonymous方法調用帶有委托的方法的常規約定來調用此方法。

編輯:

我還注意到你想要一種方法來獲得someParam1和someParam2的實際 這是你如何做到這一點:

private static object GetValue(Expression expression)
{
    var constantExpression = expression as ConstantExpression;
    if (constantExpression != null)
    {
        return constantExpression.Value;
    }

    var objectMember = Expression.Convert(expression, typeof(object));
    var getterLambda = Expression.Lambda<Func<object>>(objectMember);
    var getter = getterLambda.Compile();
    return getter();
}


private static object[] GetParameterValues(LambdaExpression expression)
{
    var methodCallExpression = expression.Body as MethodCallExpression;
    if (methodCallExpression != null)
    {
        return methodCallExpression.Arguments.Select(GetValue).ToArray();
    }

    return null;
}

所以現在在你的execute方法中,如果你這樣做:

public static T Execute<T>(Expression<Func<T>> methodParam)
{
    var methodCallExpression = methodParam.Body as MethodCallExpression;
    var method = methodCallExpression.Method;
    var parameters = method.GetParameters();

    var values = GetParameterValues(methodParam);
    return methodParam.Compile()();
}

那么值將是一個對象[],其中包含傳入的所有實際值。

我認為這根本不回答這個問題。 這實際上執行委托方法並將結果返回到values []對象。 我相信海報在詢問,我也在問如何在委托方法中獲取參數的值。

任何methodParam調用中都沒有params。
代碼: () => _service.SomeMethod1()基本上“指向”另一個返回T函數。
() => _service.SomeMethod1()相當於:
() => { return _service.SomeMethod1(); }

編輯實際回答問題(愚蠢的我):
嘗試:

T result2 =
   Execute(() =>
   {
      [BreakPoint]return _service.SomeMethod3(someParm1, someParm2)
   }
);

這不太可能。 Execute方法傳遞一個委托 - 在本例中是對匿名函數的引用。 您要問的是Execute方法查看該函數的代碼並確定它正在做什么。

這類似於我試圖在運行時查看Random.Next方法以查看它調用的方法。

暫無
暫無

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

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