Obtenir RuntimeMethodHandle de l'interface?
-
27-10-2019 - |
Question
J'ai un morceau de code dissassembled qui ne fonctionne pas très bien autour du code de réflexion. Je ne sais pas sur la façon de rendre valide car je ne sais pas comment travailler avec MethodHandles etc ... Je pense que ce devrait être une tâche assez simple pour un gourou de réflexion parce que (pour autant que je peux déduire) la seule chose qui doit arriver est 'obtenir une poignée de méthode à partir d'une interface? Ai-je raison?
Le paramètre suivant est erroné .. IProductRepositoryItem.Code devrait être un RuntimeMethodHandle
(MethodInfo) MethodBase.GetMethodFromHandle(IProductRepositoryItem.Code));
code complet:
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);
La solution
Assuming your function has no parameters, you should change the entire offending line to this:
typeof(IProductRepositoryItem).GetMethod("Code");
If it does take parameters, use the appropriate overload of GetMethod
.
EDIT: If you're trying to access a property, you should use the overload of Expression.Property
that takes a PropertyInfo
rather than a MethodInfo
.
typeof(IProductRepositoryItem).GetProperty("Code");