2009-08-20 10 views
7

Powiel możliwe:
Type.GetFields() - only returning “public const” fieldsodbijające stałe właściwości/pól w .NET

Mam klasy, która wygląda następująco:

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 stara się odzwierciedlać samo. Wiem, jak odbijać pola JEDEN, & DWIE. Ale skąd mam wiedzieć, czy jest stały, czy nie?

+4

Skutecznie dupe z http://stackoverflow.com/questions/1287797 –

+0

Biorę to z powrotem ... Nie mogę znaleźć pól JEDNEGO I DWIEGO. – deostroll

+0

Nie są to tylko pola, są to pola statyczne, a nie pola instancji. –

Odpowiedz

16

To dlatego, że są to pola, a nie właściwości. Spróbuj:

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

Edit: prawo DataDink jest, to jest gładsza używać IsLiteral

+0

uh tak, zdałem sobie sprawę, że jest za późno ... Tak, czy coś stałego jest zasadniczo statyczne? – deostroll

+0

Odpowiedź DataDink jest nieco bardziej płynna. I tak; spróbuj dodać && info.IsStatic. –

+0

jaka jest różnica między IsLiteral i IsStatic, jeśli oba są prawdziwe? – deostroll

5

FieldInfo obiekty rzeczywiście mają mnóstwo "IsSomething" logicznych tuż nad nimi

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

co pozwala zaoszczędzić maleńka ilość kodu ponad sprawdzanie atrybutów w każdym razie.