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

Puedo recorrer las propiedades con el siguiente ciclo, pero solo muestra las propiedades públicas. Necesito todas las propiedades.cómo iterar a través de las propiedades internas en C#

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

Véase también http://stackoverflow.com/questions/16024006/how-do-i-look-up-the-internal-properties -of-ac-sharp-class-protected-protecte para una variante para esto. – nawfal

Respuesta

48

Es necesario especificar que usted no sólo tiene las propiedades públicas, mediante el overload aceptar BindingFlags:

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

Agregue BindingFlags.Static si desea incluir propiedades estáticas.

La sobrecarga sin parámetros solo devuelve propiedades públicas.

+7

Giving Non Public e Instance ocultará el prop 1 y el prop 2, necesita ambos, NonPublic | Público para todas las propiedades –

+0

de todos modos para seleccionar solo protegido o interno? –

+0

@NevilleNazerane: No con banderas vinculantes, que yo sepa. Simplemente filtra después. –

10

Es necesario cambiar la BindingFlags en su llamada a Type.GetProperties

Probar:

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í, tuve que agregar BindingFlags.Public también – gangt

3

Uso BindingFlags

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

especificando lo BindingFlags en GetProperties:

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

Según MSDN, privado e interno no se reconocen en API de reflexión.

Para identificar un método interno utilizando Reflection, utilice la propiedad IsAssembly . Para identificar un método interno protegido, use el IsFamilyOrAssembly.

Si está escribiendo algunas unidades de prueba Es posible que desee echar un vistazo al atributo InternalsVisibleTo. Le permite especificar qué ensamblaje puede ver las propiedades internas.

Y, por último, lo que realmente necesita para tener características internas ...

+0

Sí, lo hago, es la clase de servicio wcf, quiero que el cliente complete algunas propiedades antes de enviarlas al servidor, y el resto de las propiedades que se completarán en el servicio. – gangt

Cuestiones relacionadas