2008-12-11 18 views
14

Estoy tratando de usar el reflejo para obtener una propiedad de una clase. Aquí hay un código de ejemplo de lo que estoy viendo:¿Por qué GetProperty no puede encontrarlo?


using System.Reflection; 
namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      PropertyInfo[] tmp2 = typeof(TestClass).GetProperties(); 
      PropertyInfo test = typeof(TestClass).GetProperty(
       "TestProp", BindingFlags.Public | BindingFlags.NonPublic); 
     } 
    } 

    public class TestClass 
    { 
     public Int32 TestProp 
     { 
      get; 
      set; 
     } 
    } 
} 

Cuando trazo a través de este, esto es lo que veo:

  • Cuando voy a buscar todas las propiedades utilizando GetProperties(), la matriz resultante tiene una entrada, para la propiedad TestProp.
  • Cuando intento buscar TestProp usando GetProperty(), obtengo nulo de nuevo.

Estoy un poco perplejo; No he podido encontrar nada en MSDN con respecto al GetProperty() para explicarme este resultado. ¿Alguna ayuda?

EDIT:

Si añado BindingFlags.Instance a la llamada GetProperties(), no hay propiedades se encuentran, y punto. Esto es más consistente y me lleva a creer que TestProp no se considera una propiedad de instancia por algún motivo.

¿Por qué sería eso? ¿Qué debo hacer a la clase para que esta propiedad se considere una propiedad de instancia?

Respuesta

12

Agregue BindingFlags.Instance a la llamada GetProperty.

EDIT: En respuesta al comentario ...

El código siguiente devuelve la propiedad.

Nota: Es una buena idea para hacer realidad su propiedad haga algo antes de intentar recuperarlo (VS2005) :)

using System.Reflection; 
namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      PropertyInfo[] tmp2 = typeof(TestClass).GetProperties(); 
      PropertyInfo test = typeof(TestClass).GetProperty(
       "TestProp", 
       BindingFlags.Instance | BindingFlags.Public | 
        BindingFlags.NonPublic); 

      Console.WriteLine(test.Name); 
     } 
    } 

    public class TestClass 
    { 
     public Int32 TestProp 
     { 
      get 
      { 
       return 0; 
      } 
      set 
      { 
      } 
     } 
    } 
} 
+0

Si hago eso, GetProperties no devuelve nada, así, lo que es consistente en menos Pero la pregunta es: ¿qué debo hacer para encontrar la propiedad con GetProperty? ¿Por qué TestProp no se considera una propiedad de Instancia? –

+0

... o ¿qué debo hacer para clasificar TestClass para que su propiedad aparezca como una propiedad de instancia? –

+0

No pude duplicar su problema (aunque estoy usando VS2005, así que tuve que desarrollar su propiedad con una implementación). –

0

Es necesario especificar si es estática o una instancia (o ambos) también.

+0

Ver comentario en la publicación de Andrew Rolling, arriba. –

1

tratar de añadir la siguiente etiqueta:

System.Reflection.BindingFlags.Instance 

EDIT: Esto funciona (al menos para mí)

PropertyInfo test = typeof(TestClass).GetProperty("TestProp", BindingFlags.Public | BindingFlags.Instance); 

Console.WriteLine(test.Name); 
+0

Ver comentarios en la publicación de Andrew Rolling, arriba. –

+0

Debe estar haciendo algo mal Remi porque, con el ejemplo que nos dio, esto funciona bien ... –

+0

Lo hace por mí, ahora también. No puedo explicarlo; culpar al usuario :-) Gracias. –

Cuestiones relacionadas