2010-11-22 23 views
29

Lo siento, estoy buscando el tipo de System.Type y el PropertyInfo escribe en la documentación, pero parece que no puedo encontrar lo que necesito.Averiguar si una propiedad es declarada virtual

¿Cómo puedo saber si una propiedad (o método o cualquier otro miembro) fue declarado virtual en su clase de declaración?

Por ej.

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

¿Cómo le digo si la propiedad fue declarada Agevirtual o no?

Respuesta

49

podría utilizar el IsVirtual propiedad:

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

Esto fallará si la propiedad que se considera es de solo escritura. – cdhowie

+0

Muchas gracias por la respuesta. –

+1

@cdhowie, sí, fallará. No incluí la comprobación de errores en mi ejemplo. –

17

Técnicamente, son propiedades que no son virtuales - sus descriptores de acceso son. Prueba esto:

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

Si quisiera, podría utilizar un método de extensión como el siguiente para determinar si una propiedad es virtual:

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 devuelve null, o bien el establecimiento no dispone de descriptores de acceso (que nunca debería suceder) o todos los usuarios de acceso a propiedades no tienen el mismo estado virtual: al menos uno es y uno no es virtual.

+1

+1 'GetAccessors()' es mejor, obviamente. –

+0

Utilicé ** LINQ ** para resolver el problema: 'var isVirtual = prop.GetType(). GetProperties() . Where (x => x.GetAccessors(). Any (a => a.IsVirtual)); ' –

+0

@MichaelCeranski Tenga en cuenta que esto no hace lo mismo que mi código cuando los accesores tienen atributos virtuales en conflicto. – cdhowie

Cuestiones relacionadas