Obtenir RuntimeMethodHandle à partir de l'interface?

c# c#-3.0 expression-trees methodhandle

Question

J'ai un morceau de code désassemblé qui ne fonctionnait pas très bien avec un code de réflexion. Je ne sais pas comment le rendre valide car je ne sais pas comment travailler avec MethodHandles, etc. Je pense que cela devrait être une tâche assez simple pour un gourou de la réflexion, car que doit-il arriver est «obtenir un handle de méthode à partir d’une interface»? Ai-je raison?

Le paramètre suivant est incorrect. IProductRepositoryItem.Code doit ê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);

Réponse acceptée

En supposant que votre fonction n'ait pas de paramètre, vous devriez changer toute la ligne incriminée en ceci:

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

Si cela prend des paramètres, utilisez la surcharge appropriée de GetMethod .

EDIT : Si vous essayez d'accéder à une propriété, vous devez utiliser la surcharge d' Expression.Property qui prend un PropertyInfo plutôt qu'un MethodInfo .

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi