繁体   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