Вы можете сделать это, используя 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 фактически преобразует выражение в исполняемый делегат. Компилятор C # также позволяет вызывать этот метод с обычными соглашениями о вызове методов, которые принимают делегаты, со стандартными лямбда-выражениями / анонимными методами.
EDIT:
Я также только что заметил, что вы хотели получить фактическое значение для 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()();
}
тогда значения будут объектом [] со всеми фактическими значениями, которые были переданы.