Как я могу получить имя метода и параметры из выражения функции? - PullRequest
0 голосов
/ 17 ноября 2010

Пример:

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

UserRepository repository = new UserRepository();
User user = (User)InvokeMethod(repository, "GetUserById", new object[]{2});

private object InvokeMethod(object source, string methodName, object[] parameters)
{
    Type sourceType = source.GetType();
    MethodInfo methodInfo = sourceType.GetMethod(methodName);
    return methodInfo.Invoke(source, parameters);            
}

Однако я бы предпочел что-то подобное:

UserRepository repository = new UserRepository();
User user = GetUserById<User, UserRepository>(repository, m => m.GetUserById(2));

Обертка может сделать это.Я начал строить один, но застрял.Вот что у меня есть:

public TUser GetUserById<TUser, TUserRepository>(TUserRepository repository, Expression<Func<TUserRepository, TUser>> repositoryFunc)
     where TUser : User
     where TUserRepoistory : UserRepository
{
    // How do I use the Expression to setup the next two statements?
    string methodName = ""; // should be "GetUserId"
    object[] params = null; // should be "object[] { 2 }"

    TUser user = (TUser)InvokeMethod(repository, methodName, parameters);
}

Имейте в виду, что я вынужден использовать метод InvokeMethod.Я не могу просто вызвать Func.

1 Ответ

4 голосов
/ 17 ноября 2010

Это становится сложным в зависимости от того, являются ли аргументы литералами, захваченными переменными и т. Д. - и являются ли они ref, out и т. Д. Возможно, вы захотите взглянуть на реализацию в protobuf-net.Extensions, здесь , который имеет код для всего этого - в частности, метод ResolveMethod.

MethodInfo прост - просто приведите Body к MethodCallExpression и получите .Method.Name- но для параметров, которые он рекурсивно вызывает в Evaluate - это позволяет таким выражениям, как SomeMethod(123, x, y.Foo.Bar), где 123 - литерал, x - захваченная переменная, а y.Foo.Bar - что-то, висящее с захваченная переменная.

...