Почему GetProperty не может его найти? - PullRequest
14 голосов
/ 11 декабря 2008

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


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 по какой-то причине не считается свойством экземпляра.

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

Ответы [ 3 ]

12 голосов
/ 11 декабря 2008

Добавить BindingFlags.Instance к вызову GetProperty.

РЕДАКТИРОВАТЬ: В ответ на комментарий ...

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

Примечание. Хорошей идеей будет заставить вашу собственность что-то сделать, прежде чем пытаться ее получить (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
            {
            }
        }
    }
}
1 голос
/ 11 декабря 2008

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

System.Reflection.BindingFlags.Instance

РЕДАКТИРОВАТЬ: Это работает (по крайней мере для меня)

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

Console.WriteLine(test.Name);
0 голосов
/ 11 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...