Подтвердить что ты не робот

Проверьте, существует ли свойство в классе

Я пытаюсь узнать, существует ли свойство в классе, я пробовал это:

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);
}
4b9b3361

Ответ 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)
{

}