2009-08-20 12 views
7

Eventuali duplicati:
Type.GetFields() - only returning “public const” fieldsRiflettendo costanti proprietà/campi in .net

ho una classe che si presenta come la seguente:

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 sta cercando di riflettere si. So come riflettere i campi ONE, & DUE. Ma come faccio a sapere se è costante o no?

+4

Effetto dupe di http://stackoverflow.com/questions/1287797 –

+0

Riporto quello ... Non riesco a trovare i campi UNO e DUE. – deostroll

+0

Non sono solo campi, sono campi statici, non campi istanza. –

risposta

16

Questo perché sono campi, non proprietà. Prova:

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

Edit: ha ragione DataDink, è più agevole da usare IsLiteral

+0

ah, l'ho capito troppo tardi ... Sì, tutto è essenzialmente statico? – deostroll

+0

La risposta di DataDink è in realtà un po 'più agevole. E sì; prova ad aggiungere && info.IsStatic. –

+0

qual è la differenza tra IsLiteral e IsStatic se entrambe sono vere? – deostroll

5

FieldInfo oggetti in realtà hanno una tonnellata di booleani "IsSomething" diritto su di loro:

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

che consente di risparmiare una piccola quantità di codice oltre il controllo degli attributi comunque.