2011-09-27 15 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; } 
} 

Posso scorrere le proprietà con il seguente ciclo, ma mostra solo proprietà pubbliche. Ho bisogno di tutte le proprietà.come faccio a scorrere le proprietà interne in C#

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

vedere anche http://stackoverflow.com/questions/16024006/how-do-i-look-up-the-internal-properties -di-ac-sharp-class-protected-protecte per una variante per questo. – nawfal

risposta

48

È necessario specificare che non si solo bisogno le proprietà pubbliche, utilizzando il overload accettando BindingFlags:

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

Aggiungi BindingFlags.Static se si desidera includere proprietà statiche.

Il sovraccarico senza parametri restituisce solo proprietà pubbliche.

+7

Giving NonPublic e Instance nascondono prop 1 e prop 2, avete bisogno di entrambi, NonPublic | Pubblico per tutte le proprietà –

+0

comunque selezionare solo protetto o interno? –

+0

@NevilleNazerane: non con bandiere vincolanti, di cui sono a conoscenza. Basta filtrare in seguito. –

10

è necessario modificare il BindingFlags sulla vostra chiamata a Type.GetProperties

Prova:

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

sì, ho dovuto aggiungere anche BindingFlags.Public – gangt

3

Usa BindingFlags

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

specificando quanto BindingFlags in GetProperties:

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

Secondo MSDN, privato e interno non sono riconosciuti in Reflection API.

Per identificare un metodo interno mediante Reflection, utilizzare la proprietà IsAssembly . Per identificare un metodo interno protetto, utilizzare IsFamilyOrAssembly.

Se si stanno scrivendo alcune unità di prova È possibile dare un'occhiata all'attributo InternalsVisibleTo. Permette di specificare quale assembly può vedere le proprietà interne.

E, infine, non si ha realmente bisogno di avere proprietà interne ...

+0

sì sì, è una classe di servizio wcf, voglio che il client inserisca alcune proprietà prima di inviarlo al server e il resto delle proprietà da compilare nel servizio. – gangt

Problemi correlati