2009-08-20 11 views
7

Duplicar posibles:
Type.GetFields() - only returning “public const” fieldsconstantes propiedades/campos en .net

tengo una clase que se parece a la siguiente:

public class MyConstants 
{ 
    public const int ONE = 1; 
    public const int TWO = 2; 

    Type thisObject; 
    public MyConstants() 
    { 
     thisObject = this.GetType(); 
    } 

    public void EnumerateConstants() 
    { 
     PropertyInfo[] thisObjectProperties = thisObject.GetProperties(BindingFlags.Public); 
     foreach (PropertyInfo info in thisObjectProperties) 
     { 
      //need code to find out of the property is a constant 
     } 
    } 
} 

Bascially que está tratando de reflejar sí mismo. Sé cómo reflejar los campos UNO, & DOS. ¿Pero cómo sé si es constante o no?

+4

Efectivamente engañado de http://stackoverflow.com/questions/1287797 –

+0

Retiro eso ... No puedo encontrar los campos UNO Y DOS. – deostroll

+0

No son solo campos, son campos estáticos, no campos de instancia. –

Respuesta

16

Eso es porque son campos, no propiedades. Proveedores:

public void EnumerateConstants() {   
     FieldInfo[] thisObjectProperties = thisObject.GetFields(); 
     foreach (FieldInfo info in thisObjectProperties) { 
      if (info.IsLiteral) { 
       //Constant 
      } 
     }  
    } 

Editar: el derecho de DataDink, que es más suave para usar IsLiteral

+0

eh, sí, me di cuenta demasiado tarde ... Sí, ¿hay algo esencialmente estático? – deostroll

+0

La respuesta de DataDink es en realidad un poco más suave. Y si; intente agregar && info.IsStatic. –

+0

¿Cuál es la diferencia entre IsLiteral e IsStatic si ambos son verdaderos? – deostroll

5

FieldInfo objetos en realidad tienen una tonelada de booleanos "IsSomething" derecho sobre ellos:

var m = new object(); 
foreach (var f in m.GetType().GetFields()) 
if (f.IsLiteral) 
{ 
    // stuff 
} 

que le ahorra una pequeña cantidad de código sobre la comprobación de los atributos de todos modos.