Получить значение параметра из выражения Linq

У меня следующий класс

public class MyClass
{
    public bool Delete(Product product)
    {
        // some code.
    }
}

Теперь у меня есть вспомогательный класс, который выглядит следующим образом

public class Helper<T, TResult>
{

    public Type Type;
    public string Method;
    public Type[] ArgTypes;
    public object[] ArgValues;

    public Helper(Expression<Func<T, TResult>> expression)
    {
        var body = (System.Linq.Expressions.MethodCallExpression)expression.Body;

        this.Type = typeof(T);
        this.Method = body.Method.Name;
        this.ArgTypes = body.Arguments.Select(x => x.Type).ToArray();
        this.ArgValues = ???
    }
}

Идея состоит в том, чтобы использовать этот код откуда-то:

// I am returning a helper somewhere
public Helper<T> GetMethod<T>()
{
    var product = GetProduct(1);
    return new Helper<MyClass>(x => x.Delete(product));
}

// some other class decides, when to execute the helper 
// Invoker already exists and is responsible for executing the method
// that is the main reason I don't just comile and execute my Expression
public bool ExecuteMethod<T>(Helper<T> helper)
{
    var instance = new MyClass();
    var Invoker = new Invoker(helper.Type, helper.Method, helper.ArgTypes, helper.ArgValues);
    return (bool)Invoker.Invoke(instance);
}

Дело в том, что я застрял в том, как извлечь аргументы из самого выражения.

Я нашел этот путь

((ConstantExpression)((MemberExpression)body.Arguments[0]).Expression).Value

который кажется типом объекта с полем «продукт», но я считаю, что должно быть более простое решение.

Какие-либо предложения.

Обновить

Просто чтобы уточнить, я изменил свой код в соответствии с тем, что я хочу достичь. В моем приложении реального слова у меня уже есть класс, который делает то же самое, но без дерева выражений:

var helper = new Helper(typeof(MyClass), "Delete", 
    new Type[] { typeof(Product) }, new object[] {product}));

Основная причина моегоHelper<T> должен иметь проверку времени компиляции, если подпись метода действительна.

Обновление 2

Это моя текущая реализация, есть ли лучший способ получить доступ к значениям, не используя отражения?

public Helper(Expression<Func<T, TResult>> expression)
{
    var body = (System.Linq.Expressions.MethodCallExpression)expression.Body;

    this.Type = typeof(T);
    this.Method = body.Method.Name;
    this.ArgTypes = body.Arguments.Select(x => x.Type).ToArray();

    var values = new List<object>();
    foreach(var arg in body.Arguments)
    {
        values.Add(
            (((ConstantExpression)exp.Expression).Value).GetType()
                .GetField(exp.Member.Name)
                .GetValue(((ConstantExpression)exp.Expression).Value);
        );
    }
    this.ArgValues = values.ToArray();
}

Ответы на вопрос(3)

Ваш ответ на вопрос