2011-09-27 52 views
24
public class TestClass 
{ 
     public string property1 { get; set; } 
     public string property2 { get; set; } 

     internal string property3 { get; set; } 
     internal string property4 { get; set; } 
     internal string property5 { get; set; } 
} 

我可以迭代通過以下循環的屬性,但它只顯示公共屬性。我需要所有的屬性。我如何迭代通過內部屬性在C#

foreach (PropertyInfo property in typeof(TestClass).GetProperties()) 
{ 
    //do something 
} 
+0

另見http://stackoverflow.com/questions/16024006/how-do-i-look-up-the-internal-properties這種類型的ac-sharp-class-protected-protecte。 – nawfal

回答

48

你需要指定你不只是需要的公共屬性,使用overload接受BindingFlags

foreach (PropertyInfo property in typeof(TestClass) 
      .GetProperties(BindingFlags.Instance | 
          BindingFlags.NonPublic | 
          BindingFlags.Public)) 
{ 
    //do something 
} 

如果要包含靜態屬性,請添加BindingFlags.Static

無參數重載只返回公共屬性。

+7

給非公共和實例將隱藏道具1和道具2,你需要兩個,NonPublic |公開所有屬性 –

+0

反正只選擇受保護或內部? –

+0

@NevilleNazerane:沒有綁定標誌,我知道。之後過濾。 –

10

您需要在您的電話改變BindingFlagsType.GetProperties

嘗試:

var instanceProperties = typeof(TestClass).GetProperties(
    BindingFlags.Public | 
    BindingFlags.NonPublic | 
    BindingFlags.Instance 
); 
foreach(var instanceProperty in instanceProperties) { 
    // a little something something for the instanceProperty 
} 
+0

是的,我不得不添加BindingFlags.Public以及 – gangt

3

使用BindingFlags

foreach (PropertyInfo property in typeof(TestClass) 
     .GetProperties(
      BindingFlags.Public | 
      BindingFlags.NonPublic | 
      BindingFlags.Instance)) 
{ 
    //do something 
} 
3

通過指定的GetProperties什麼的BindingFlags:

foreach (PropertyInfo property in typeof(TestClass).GetProperties(
     BindingFlags.Instance| 
     BindingFlags.Public| 
     BindingFlags.NonPublic)) 
3

MSDN,私人和內部的反射API無法識別。

要使用反射識別內部方法,請使用IsAssembly 屬性。要識別受保護的內部方法,請使用IsFamilyOrAssembly或 IsFamilyOrAssembly。

如果您正在編寫一些測試單元您可能想看看InternalsVisibleTo屬性。它允許您指定哪個程序集可以查看內部屬性。

最後,你真的需要有內部屬性...

+0

是的,我這樣做,它是wcf服務類,我希望客戶在將其發送到服務器之前填寫一些屬性,並在服務中填寫其餘屬性。 – gangt