Почему 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(), я вернусь обратно.

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

EDIT:

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

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

Ответы

Ответ 1

Добавьте 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
            {
            }
        }
    }
}

Ответ 2

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

System.Reflection.BindingFlags.Instance

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

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

Console.WriteLine(test.Name);

Ответ 3

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