2010-11-22 16 views
29

Spiacente, sto cercando il tipo System.Type e il tipo PropertyInfo nella documentazione ma non riesco a trovare la cosa di cui ho bisogno.Scopri se una proprietà è dichiarata virtuale

Come faccio a sapere se una proprietà (o un metodo o qualsiasi altro membro) è stata dichiarata virtual nella sua classe di dichiarazione?

Ad es.

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

Come faccio a sapere se la proprietà è stata dichiarata Agevirtual o no?

risposta

49

è possibile utilizzare la proprietà IsVirtual:

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

Questo fallirà se la proprietà considerata è di sola scrittura. – cdhowie

+0

Mille grazie per la risposta. –

+1

@cdhowie, sì, fallirà. Non ho incluso il controllo degli errori nel mio esempio. –

17

Tecnicamente, le proprietà non sono virtuali - le loro funzioni di accesso sono. Prova questo:

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

Se si volesse, si potrebbe utilizzare un metodo di estensione simile al seguente per determinare se una proprietà è virtuale:

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; 
} 

se restituisce null, sia la struttura non dispone di funzioni di accesso (che non dovrebbe mai accadere) o tutti gli accessor di proprietà non hanno lo stesso stato virtuale - almeno uno è e uno non è virtuale.

+1

+1 'GetAccessors()' è migliore, ovviamente. –

+0

Ho usato ** LINQ ** per risolvere il problema: 'var isVirtual = prop.GetType(). GetProperties() .Where (x => x.GetAccessors(). Any (a => a.IsVirtual)); ' –

+0

@MichaelCeranski Si noti che questo non fa la stessa cosa del mio codice quando gli accessor hanno attributi virtuali in conflitto. – cdhowie

Problemi correlati