2012-06-22 16 views
9

Considérese la clase siguiente:¿Cómo puedo utilizar la reflexión para obtener el valor de una propiedad estática de un tipo sin una instancia concreta

public class AClass : ISomeInterface 
{ 
    public static int AProperty 
    { 
    get { return 100; } 
    } 
} 

entonces tengo otra clase de la siguiente manera:

public class AnotherClass<T> 
    where T : ISomeInterface 
{ 

} 

me ejemplo a través de la cual:

AnotherClass<AClass> genericClass = new AnotherClass<AClass>(); 

¿Cómo puedo obtener el valor estático de AClass.AProperty desde dentro de mis genericClass sin tener una instancia concreta de AClass?

Respuesta

10

Algo así como

typeof(AClass).GetProperty("AProperty").GetValue(null, null) 

va a hacer. No te olvides de lanzar al int.

Enlace de documentación: http://msdn.microsoft.com/en-us/library/b05d59ty.aspx (también tienen ejemplos con propiedades estáticas). Pero si conoce exactamente AClass, puede usar solo AClass.AProperty.

Si está dentro de AnotherClass<T>T = AClass, puede hacer referencia a ella como T:

typeof(T).GetProperty("AProperty").GetValue(null, null) 

Esto funcionará si se sabe con certeza que su T tiene la propiedad estática AProperty. Si no existe garantía de que dicha propiedad exista en cualquier T, debe verificar los valores/excepciones de devolución en el camino.

Si solamente AClass es interesante para usted, usted puede usar algo como

if (typeof(T) == typeof(AClass)) 
    n = AClass.AProperty; 
else 
    ??? 
+0

Grande. El único problema que he descubierto ahora es que no puedo definir la propiedad estática en la interfaz, lo que debe hacer. Supongo que podría agregar una propiedad no estática y una propiedad estática que devuelva el mismo valor, uno para la instancia a usar y otro para hacer referencia al tipo. ¿O hay otra forma de evitarlo? –

+0

Como alternativa, podría obtener la propiedad no estática usando la nueva propiedad T() .PROperty, pero parece que sería una mala práctica. ¿Qué piensas? –

+0

@Stewart: Bueno, construir una nueva 'T' puede ser costoso. Es una pena que las interfaces no puedan incluir cosas estáticas, de hecho. – Vlad

1

En primer lugar obtener el tipo genérico de su AnotherClass ejemplo.

A continuación, obtenga la propiedad estática.

A continuación, obtenga el valor estático de la propiedad.

// I made this sealed to ensure that `this.GetType()` will always be a generic 
// type of `AnotherClass<>`. 
public sealed class AnotherClass<T> 
{ 
    public AnotherClass(){ 
     var aPropertyValue = ((PropertyInfo) 
       this.GetType() 
        .GetGenericArguments()[0] 
        .GetMember("AProperty")[0]) 
      .GetValue(null, null); 
    } 
} 

Reconociendo, por supuesto, que no es posible asegurar que "AProperty" existirá, ya que las interfaces no funcionan en firmas estáticas, quité ISomeInterface por ser irrelevante para la solución.

Cuestiones relacionadas