Почему GetProperty не удается найти его?

Я пытаюсь использовать отражение, чтобы получить свойство из класса. Вот пример кода того, что я вижу:


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;
        }
    }
}

когда я прослеживаю через это, вот что я вижу:

  • когда я получаю все свойства, используя GetProperties(), результирующий массив имеет одну запись, для свойства TestProp.
  • когда я пытаюсь получить TestProp используя GetProperty(), Я получаю null обратно.

Я немного в тупике; я не смог найти ничего в MSDN в отношении GetProperty() чтобы объяснить мне этот результат. Любой помочь?

EDIT:

если я добавить BindingFlags.Instance до GetProperties() вызов, свойства не найдены, точка. Это более последовательно и заставляет меня поверить, что TestProp по какой-то причине не считается свойством экземпляра.

почему бы это? Что мне нужно сделать с классом, чтобы это свойство считалось свойством экземпляра?

3 ответов


добавить BindingFlags.Instance до GetProperty звонок.

EDIT: в ответ на комментарий...

следующий код возвращает собственность.

Примечание: это хорошая идея, чтобы на самом деле сделать вашу собственность сделать что-то, прежде чем пытаться получить его (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
            {
            }
        }
    }
}

попробуйте добавить следующий тег:

System.Reflection.BindingFlags.Instance

EDIT: это работает (по крайней мере для меня)

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

Console.WriteLine(test.Name);

вам нужно указать, является ли он статическим или экземпляром (или и тем, и другим).