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#コンパイラでは、標準のラムダ/匿名メソッドを使用して、デリゲートを受け取るメソッドを呼び出すという通常の規則を使用して、このメソッドを呼び出すこともできます。
編集:
また、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()();
}
その場合、値は、渡されたすべての実際の値を含むobject[]になります。