您可以使用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/匿名方法来调用此方法。
编辑:
我还刚刚注意到您想要一种方法来获取 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;
}
所以现在在你的执行方法中,如果你这样做:
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()();
}
那么这些值将是一个 object[] ,其中包含传入的所有实际值。