Проверьте, существует ли свойство в классе
Я пытаюсь узнать, существует ли свойство в классе, я пробовал это:
public static bool HasProperty(this object obj, string propertyName)
{
return obj.GetType().GetProperty(propertyName) != null;
}
Я не понимаю, почему первый тестовый метод не проходит?
[TestMethod]
public void Test_HasProperty_True()
{
var res = typeof(MyClass).HasProperty("Label");
Assert.IsTrue(res);
}
[TestMethod]
public void Test_HasProperty_False()
{
var res = typeof(MyClass).HasProperty("Lab");
Assert.IsFalse(res);
}
Ответы
Ответ 1
Ваш метод выглядит следующим образом:
public static bool HasProperty(this object obj, string propertyName)
{
return obj.GetType().GetProperty(propertyName) != null;
}
Это добавляет расширение на object
- базовый класс всего. Когда вы вызываете это расширение, вы передаете его Type
:
var res = typeof(MyClass).HasProperty("Label");
Ваш метод ожидает экземпляр класса, а не Type
. В противном случае вы по существу делаете
typeof(MyClass) - this gives an instanceof `System.Type`.
Тогда
type.GetType() - this gives `System.Type`
Getproperty('xxx') - whatever you provide as xxx is unlikely to be on `System.Type`
Как правильно указывает @PeterRitchie, на данный момент ваш код ищет свойство Label
on System.Type
. Это свойство не существует.
Решение есть либо
a) Предоставьте экземпляр MyClass для расширения:
var myInstance = new MyClass()
myInstance.HasProperty("Label")
b) Поместите расширение на System.Type
public static bool HasProperty(this Type obj, string propertyName)
{
return obj.GetProperty(propertyName) != null;
}
и
typeof(MyClass).HasProperty("Label");
Ответ 2
Это отвечает на другой вопрос, но, надеюсь, это может помочь кому-то, кто это читает. Я искал немного другую проблему, и это было моим решением:
Если вы пытаетесь выяснить, имеет ли объект OBJECT (не класс) свойство,
OBJECT.GetType().GetProperty("PROPERTY") != null
возвращает true, если (но не только если) свойство существует.
В моем случае я был в ASP.NET MVC Partial View и хотел что-то сделать, если либо свойство не было, либо свойство (логическое) было истинным.
@if ((Model.GetType().GetProperty("AddTimeoffBlackouts") == null) ||
Model.AddTimeoffBlackouts)
помог мне здесь.
Ответ 3
Есть 2 возможности.
У вас действительно нет свойства Label
.
Вам нужно вызвать соответствующую GetProperty перегрузку и передать правильные флаги привязки, например. BindingFlags.Public | BindingFlags.Instance
Если ваше свойство не является общедоступным, вам нужно будет использовать BindingFlags.NonPublic
или другую комбинацию флагов, которая соответствует вашему прецеденту. Прочтите справочные документы API, чтобы найти подробности.
EDIT:
ooops, просто заметили, что вы вызываете GetProperty
на typeof(MyClass)
. typeof(MyClass)
- Type
, который, несомненно, не имеет свойства Label
.
Ответ 4
Если вы привязываетесь, как я:
<%# Container.DataItem.GetType().GetProperty("Property1") != null ? DataBinder.Eval(Container.DataItem, "Property1") : DataBinder.Eval(Container.DataItem, "Property2") %>
Ответ 5
Я получил эту ошибку: "Тип не содержит определения для GetProperty" при связывании принятого ответа.
Вот что я закончил с:
using System.Reflection;
if (productModel.GetType().GetTypeInfo().GetDeclaredProperty(propertyName) != null)
{
}