2011-10-20 16 views
22

Bazıları bana, GetProperties yönteminin sınıf aşağıdaki gibi kurulduğunda neden kamu değerlerini döndürmeyeceğini açıklayabilir.System.Reflection GetProperties yöntemi değerleri döndürmüyor

public class DocumentA 
{ 
    public string AgencyNumber = string.Empty; 
    public bool Description; 
    public bool Establishment; 
} 

ile oynamak için basit bir birim test metodu kurmaya çalışıyorum Yöntem aşağıdaki gibidir ve tüm uygun kullanım ifadelerine ve referanslarına sahiptir.

Tüm yaptığım aşağıdakileri çağırıyor ama 0

PropertyInfo[] pi = target.GetProperties(BindingFlags.Public | BindingFlags.Instance); 

döndürüyor. Ama eğer sınıfı özel üyelerle ve genel özellikleriyle kurarsam, iyi çalışıyor.

Sınıfı eski okul yolunu kurmamamın sebebi, bunun 61 mülk sahibi olması ve bunu yapmak benim kod satırlarımın en az üç katına çıkarılmasıydı. Bakım kabusu olurdum.

+2

Bu tür açık, sınıf herhangi özelliklere sahip değildir. Sadece alanlar. Sınıfın böyle havaya uçmasına izin verdiğinde kabus başladı. Herkese açık alanların kullanılması daha fazla uykuya mal olur. –

cevap

44

herhangi özelliklere ilan etmedik - Eğer alanları ilan ettik. Burada özelliklere sahip benzer kod:

public class DocumentA 
{ 
    public string AgencyNumber { get; set; } 
    public bool Description { get; set; } 
    public bool Establishment { get; set; } 

    public DocumentA() 
    { 
     AgencyNumber = ""; 
    } 
} 

şiddetle yerine Type.GetFields kullanmak değişen yukarıdaki gibi (ya da muhtemelen daha kısıtlı belirleyiciler ile) özelliklerini kullanmak için tavsiye ederiz. Kamu alanları kapsüllemeyi ihlal ediyor. (Kamusal mutable özellikleri kapsülleme cephesinde mükemmel değildir, fakat en azından bir API verir, bunların uygulanabilmesi daha sonra değiştirilebilir.)

+0

Alanlar yerine mülkleri tamamen kullanmaya devam ediyorum. Doğru sözdizimini bilmiyordum. Normalde özel alanları ve kamu alıcılarını ve belirleyicileri beyan ederim. Benim sorunum, aslında {get, set} eksikken özellikleri kullandığımı düşündüm. Açıklama için teşekkürler. – gsirianni

+0

Bu cevap gerçekten Cevabınız için –

4

Artık sınıfınızı bildirme şekliniz Fields kullanıyor. Alan yansıma yansımalarına erişmek istiyorsanız, Type.GetFields() öğesini kullanmalısınız (bkz. Types.GetFields Metodu 1)

Şu an kullandığınız C# sürümünü kullanmıyorum ama özellik sözdizimi C# olarak değiştirildi Aşağıdakilere 2'ye bakınız:

public class Foo 
{ 
    public string MyField; 
    public string MyProperty {get;set;} 
} 

Bu, kod miktarını azaltmada yardımcı olmaz mıydı?

+0

teşekkürler bana yardım etti. Sadece benim sözdizimi karıştırdım. Normalde mülkleri bu şekilde beyan etmem.En çok tiem özel alanlara sahip kamu mülklerim var. – gsirianni

+2

Ama neden? Kısa el sözdizimini kullanmak aynı IL'ye derler. Derleyici sizin için arka alan oluşturur. Alıcının veya ayarlayıcının içinde başka bir işlem yapmak istediğinizde yalnızca daha ayrıntılı sözdizimine ihtiyacınız vardır. –

0

belirtildiği gibi, bu alanlar özellikler değildir.

public class DocumentA { 
    public string AgencyNumber { get; set; } 
    public bool Description { get; set; } 
    public bool Establishment { get; set;} 
} 
1

Bu iş parçacığı zaten dört yaşında bkz ama hiçbiri az sağladığım cevapları ile tatminsiz oldu: mülkiyet sözdizimi olacaktır. OP, OP'nin Alanlar Olmayan Özellikler'e başvurduğunu not etmelidir. dinamik tüm alanları (genleşme geçirmez) sıfırlamak için deneyin: GetFields() yalnızca bariz nedenlerden kamu alanlarına erişimi olduğundan

/** 
* method to iterate through Vehicle class fields (dynamic..) 
* resets each field to null 
**/ 
public void reset(){ 
    try{ 
     Type myType = this.GetType(); //get the type handle of a specified class 
     FieldInfo[] myfield = myType.GetFields(); //get the fields of the specified class 
     for (int pointer = 0; pointer < myfield.Length ; pointer++){ 
      myfield[pointer].SetValue(this, null); //takes field from this instance and fills it with null 
     } 
    } 
    catch(Exception e){ 
     Debug.Log (e.Message); //prints error message to terminal 
    } 
} 

Not.

+0

Bu yanıt, alandaki hatalı bir şekilde GetProperties() kullanıyor olsa bile, bu yanıt alanlardaki ilk soruyu giderir. Teşekkür ederim! –

İlgili konular