Я пытаюсь узнать, существует ли свойство в классе, я пробовал это:
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);
}
c#
.net
reflection
Крис-I
источник
источник
MyClass
?Ответы:
Ваш метод выглядит так:
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
наSystem.Type
. Этого свойства не существует.Решение либо
a) Предоставьте расширению экземпляр MyClass:
var myInstance = new MyClass() myInstance.HasProperty("Label")
б) Наденьте удлинитель
System.Type
public static bool HasProperty(this Type obj, string propertyName) { return obj.GetProperty(propertyName) != null; }
и
typeof(MyClass).HasProperty("Label");
источник
, not
MyClass.Label`.Это отвечает на другой вопрос:
Если вы пытаетесь выяснить, имеет ли ОБЪЕКТ (не класс) свойство,
OBJECT.GetType().GetProperty("PROPERTY") != null
возвращает истину, если (но не только если) свойство существует.
В моем случае я был в частичном представлении ASP.NET MVC и хотел отрендерить что-нибудь, если либо свойство не существует, либо свойство (логическое) было истинным.
@if ((Model.GetType().GetProperty("AddTimeoffBlackouts") == null) || Model.AddTimeoffBlackouts)
помог мне здесь.
Изменить: в настоящее время, вероятно, разумно использовать
nameof
оператор вместо строкового имени свойства.источник
nameof
оператора, будет ли он работать (без исключения), чтобы получить имя свойства, которое может не существовать? Поскольку исходный вопрос предполагал, что мы не знаем, существует ли это свойство?Есть 2 возможности.
У тебя действительно нет
Label
собственности.Вам нужно вызвать соответствующую перегрузку GetProperty и передать правильные флаги привязки, например
BindingFlags.Public | BindingFlags.Instance
Если ваша собственность не является общедоступной, вам нужно будет использовать
BindingFlags.NonPublic
или другую комбинацию флагов, которая соответствует вашему варианту использования. Прочтите упомянутую документацию по API, чтобы узнать подробности.РЕДАКТИРОВАТЬ:
Опа, только заметил , что вы звоните
GetProperty
наtypeof(MyClass)
.typeof(MyClass)
уType
которого точно нетLabel
собственности.источник
Instance|Public|Static
iirc.Label
это частная собственность.Я получил эту ошибку: «Тип не содержит определения для GetProperty» при связывании принятого ответа.
Вот что у меня получилось:
using System.Reflection; if (productModel.GetType().GetTypeInfo().GetDeclaredProperty(propertyName) != null) { }
источник
Если вы связываетесь, как я:
<%# Container.DataItem.GetType().GetProperty("Property1") != null ? DataBinder.Eval(Container.DataItem, "Property1") : DataBinder.Eval(Container.DataItem, "Property2") %>
источник
Я не уверен в контексте того, почему это было необходимо, так что это может не дать вам достаточно информации, но вот что я смог сделать:
if(typeof(ModelName).GetProperty("Name of Property") != null) { //whatevver you were wanting to do. }
В моем случае я просматриваю свойства из отправки формы, а также имею значения по умолчанию для использования, если запись оставлена пустой - поэтому мне нужно было знать, было ли значение для использования - я поставил все свои значения по умолчанию в модели с Default, поэтому все, что мне нужно было сделать, это проверить, есть ли свойство, которое начинается с этого.
источник