2009-08-20 14 views
7

Olası Çoğalt:
Type.GetFields() - only returning “public const” fieldsyansıtan sabit özellikler/alanlar

ben şöyle şöyle bir sınıf var:

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 o çalışıyor yansıtmak için kendisi. ONE, & TWO alanlarını nasıl yansıtacağımı biliyorum. Ama bir sabit olup olmadığını nasıl bilebilirim?

+4

http://stackoverflow.com/questions/1287797 –

+0

'un etkin bir şekilde dupe edilmesi Bunu geri alıyorum ... Alanları ONE & TWO'yu bulamıyorum. – deostroll

+0

Sadece alanlar değil, statik alanlar, örnek alanlar değiller. –

cevap

16

Çünkü bunlar alanlar değil, özelliklerdir. Deneyin:

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

Düzenleme:

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

size minik kaydeder: DataDink haklı, o IsLiteral

+0

uh evet, çok geç fark ettim ... Evet, aslında bir şey durağan değil midir? – deostroll

+0

DataDink'in cevabı aslında biraz daha pürüzsüz. Ve evet; && info.IsStatic adresini eklemeyi deneyin. –

+0

Her ikisi de doğruysa IsLiteral & IsStatic arasındaki fark nedir? – deostroll

5

Fieldınfo aslında doğru üzerlerinde "IsSomething" boole ton var nesnelerin kullanımı pürüzsüz var Niteliklerini kontrol etmek için kodun yerini al.