2011-12-02 2 views
1

J'ai un morceau de code démonté qui ne marchait pas très bien autour d'un code de réflexion. Je n'ai aucune idée sur la façon de le 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 la réflexion parce que (autant que je peux déduire) la seule chose ce qui doit arriver est 'obtenir un handle de méthode à partir d'une interface'? Ai-je raison?Obtenir RuntimeMethodHandle à partir de l'interface?

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); 
+0

Je n'ai jamais utilisé 'RuntimeMethodHandle' en C#. C'est assez commun si vous écrivez un compilateur. – leppie

+0

Toutes les autres questions marquées [methodhandle] semblent concerner la fonction Java. Y a-t-il un tag lié au C# qui serait plus approprié pour cette question? (Je ne sais pas C#, donc je vous laisse (à tout le monde) le changer, si nécessaire.) –

Répondre

2

En supposant que votre fonction n'a pas de paramètres, vous devez changer toute la ligne incriminée à ce:

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

S'il 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 de Expression.Property qui prend un PropertyInfo plutôt qu'un MethodInfo.

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

Cela retourne un 'PropertyInfo' tandis que' GetMethodFromHandle' n'accepte qu'un 'RuntimeMethodHandle'. EDIT: Oups Je ne suis pas vos instructions exactes ... – Ropstah

+0

@Ropstah: Comment 'GetMethod' peut retourner un' PropertyInfo'? Ne calcule pas. – leppie

+0

Le code est une propriété, je pensais que je le changerais sans "refléter" ces changements ici dans la question ...;) – Ropstah

Questions connexes