Получить Runtimemethod Handle из интерфейса?
-
27-10-2019 - |
Вопрос
У меня есть фрагмент разобранного кода, который не совсем хорошо работал с некоторым кодом отражения.Я понятия не имею, как сделать это действительным, так как я не знаю, как работать с MethodHandles и т.д...Я думаю, что это должно быть довольно простой задачей для гуру рефлексии, потому что (насколько я могу судить) единственное, что должно произойти, это "получение дескриптора метода из интерфейса"?Я прав?
Следующий параметр неверен..IProductRepositoryItem.Код должен быть 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);
Решение
Предполагая, что ваша функция не имеет параметров, вы должны изменить всю нарушающую строку на эту:
typeof(IProductRepositoryItem).GetMethod("Code");
Если он действительно принимает параметры, используйте соответствующую перегрузку GetMethod
.
Редактировать:Если вы пытаетесь получить доступ к свойству, вам следует использовать перегрузку Expression.Property
для этого требуется PropertyInfo
вместо того, чтобы MethodInfo
.
typeof(IProductRepositoryItem).GetProperty("Code");