Почему 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
Вам нужно указать, является ли он статическим или экземпляром (или обоими) тоже.