Получить RuntimeMethodHandle из интерфейса? - PullRequest
1 голос
/ 02 декабря 2011

У меня есть фрагмент дизассемблированного кода, который не очень хорошо работал с некоторым кодом отражения. Я понятия не имею, как сделать его действительным, поскольку я не знаю, как работать с MethodHandles и т. Д. ... Я думаю, что это должно быть довольно простой задачей для гуру отражения, потому что (насколько я могу вычесть) единственная вещь что должно произойти, это «получение дескриптора метода из интерфейса»? Я прав?

Следующий параметр неверен. IProductRepositoryItem.Code должен быть RuntimeMethodHandle

(MethodInfo) MethodBase.GetMethodFromHandle(IProductRepositoryItem.Code));

Полный код:

ParameterExpression parameterExpression = Expression.Parameter(typeof (T), "i");
// ISSUE: method reference

Expression<Func<T, object>> property =
    Expression.Lambda<Func<T, object>>(
        (Expression) Expression.Property(
            (Expression) Expression.Convert((Expression) parameterExpression, typeof (IProductRepositoryItem)),
            (MethodInfo) MethodBase.GetMethodFromHandle(IProductRepositoryItem.Code)), 
                new ParameterExpression[1] {
                     parameterExpression
                });
string key = entityHelper.GetField<T>(property);

1 Ответ

2 голосов
/ 02 декабря 2011

Предполагая, что ваша функция не имеет параметров, вы должны изменить всю строку с ошибкой следующим образом:

typeof(IProductRepositoryItem).GetMethod("Code");

Если она принимает параметры, используйте соответствующую перегрузку GetMethod.

РЕДАКТИРОВАТЬ : если вы пытаетесь получить доступ к свойству, вам следует использовать перегрузку Expression.Property, которая принимает PropertyInfo вместо MethodInfo.

typeof(IProductRepositoryItem).GetProperty("Code");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...