Question

Je fais une analyse de type à l'exécution en utilisant la réflexion. Si j'ai une instance MethodInfo, comment puis-je savoir si cela est une méthode « réel » ou est une méthode getter / setter d'une propriété? Et si elle est une propriété, comment puis-je retrouver le son PropertyInfo hébergement?

Était-ce utile?

La solution

Ecma 335 (mais précise ne demande pas) que les statisticiens utilisent les préfixes get_ / set_ (chapitre 22.28). Je ne sais pas une langue qui casse cette recommandation. Rendre facile:

public static PropertyInfo GetPropFromMethod(Type t, MethodInfo method) {
  if (!method.IsSpecialName) return null;
  return t.GetProperty(method.Name.Substring(4), 
    BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
}

Autres conseils

Eh bien, la méthode derrière un getter et setter sont méthodes "réelles".

Re suivi retour à une propriété - le motif (retour vs prendre 1 arg) contribuera à la réduire -. Mais vous devez appeler GetGetMethod / GetSetMethod sur chacun pour trouver la propriété

Vous pouvez probablement essayez le Name (moins get __ / set__) - mais qui se sent fragile. Voici la version plus longue (pas d'utilisation de <=>):

static PropertyInfo GetProperty(MethodInfo method)
{
    bool takesArg = method.GetParameters().Length == 1;
    bool hasReturn = method.ReturnType != typeof(void);
    if (takesArg == hasReturn) return null;
    if (takesArg)
    {
        return method.DeclaringType.GetProperties()
            .Where(prop => prop.GetSetMethod() == method).FirstOrDefault();
    }
    else
    {
        return method.DeclaringType.GetProperties()
            .Where(prop => prop.GetGetMethod() == method).FirstOrDefault();
    }
}

Regardez dans MethodBase.IsSpecialName. Les méthodes qui ne devrait pas être clairement visible, comme accesseurs de propriété, les méthodes de souscription d'événements et de l'opérateur utilisent les surcharges ce drapeau.

A ma connaissance, il n'y a pas moyen de trouver le itérer sans PropertyInfo les propriétés et en comparant les méthodes.

Je voudrais vraiment laisser cela comme un commentaire, mais je ne peux pas depuis mon représentant ne est pas assez élevé: (

Theres un bug dans le code de Marc Gravell: si son un indexeur elle retournera nulle, même si une propriété parent existe. Son agréable d'avoir cette rapide échec, mais je pense que nous ne pouvons le faire quand il n'a ni une valeur de retour ou d'un paramètre:

    [Pure]
    public static PropertyInfo GetParentProperty(this MethodInfo method)
    {
        if (method == null) throw new ArgumentNullException("method");
        var takesArg = method.GetParameters().Length == 1;
        var hasReturn = method.ReturnType != typeof(void);
        if (!(takesArg || hasReturn)) return null;

        if (takesArg && !hasReturn)
        {
            return method.DeclaringType.GetProperties().FirstOrDefault(prop => prop.GetSetMethod() == method);
        }
        else
        {
            return method.DeclaringType.GetProperties().FirstOrDefault(prop => prop.GetGetMethod() == method);
        }
    }

L'astuce pour jouer avec BindingFlags.DeclaredOnly et IsSpecialName

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top