2010-11-22 7 views
29

Désolé, je cherche le type System.Type et le type PropertyInfo dans la documentation mais je n'arrive pas à trouver la chose dont j'ai besoin.Savoir si une propriété est déclarée virtuelle

Comment savoir si une propriété (ou une méthode ou un autre membre) a été déclarée virtual dans sa classe déclarante?

Par exemple.

class Cat 
{ 
    public string Name { get; set; } 
    public virtual int Age { get; set; } 
} 

Comment puis-je savoir si la propriété a été déclarée Agevirtual ou non?

Répondre

49

Vous pouvez utiliser la propriété IsVirtual:

var isVirtual = typeof(Cat).GetProperty("Age").GetGetMethod().IsVirtual; 
+1

Échec si la propriété considérée est en écriture seule. – cdhowie

+0

Un grand merci pour la réponse. –

+1

@cdhowie, oui ça va échouer. Je n'ai pas inclus la vérification des erreurs dans mon exemple. –

17

Techniquement, les propriétés ne sont pas virtuelles - leurs accesseurs sont. Essayez ceci:

typeof(Cat).GetProperty("Age").GetAccessors()[0].IsVirtual 

Si vous voulez, vous pouvez utiliser une méthode d'extension comme suit pour déterminer si une propriété est virtuelle:

public static bool? IsVirtual(this PropertyInfo self) 
{ 
    if (self == null) 
     throw new ArgumentNullException("self"); 

    bool? found = null; 

    foreach (MethodInfo method in self.GetAccessors()) { 
     if (found.HasValue) { 
      if (found.Value != method.IsVirtual) 
       return null; 
     } else { 
      found = method.IsVirtual; 
     } 
    } 

    return found; 
} 

Si elle retourne null, que ce soit la propriété n'a pas accesseurs (ce qui ne devrait jamais arriver) ou tous les accesseurs de propriété n'ont pas le même statut virtuel - au moins un est et un n'est pas virtuel.

+1

+1 'GetAccessors()' est meilleur, évidemment. –

+0

J'ai utilisé ** LINQ ** pour résoudre le problème: 'var isVirtual = prop.GetType(). GetProperties() .Where (x => x.GetAccessors(). Tout (a => a.IsVirtual)); ' –

+0

@MichaelCeranski Notez que cela ne fait pas la même chose que mon code lorsque les accesseurs ont des attributs virtuels en conflit. – cdhowie

Questions connexes