检查一个属性是否存在于一个类中

我尝试了解一个类是否存在一个属性,我试过这个:

public static bool HasProperty(this object obj, string propertyName) { return obj.GetType().GetProperty(propertyName) != null; } 

我不明白为什么第一个testing方法不通过?

 [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); } 

你的方法看起来像这样:

 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正确指出的,在这一点上你的代码正在寻找System.Type属性Label 。 该属性不存在。

解决scheme也是

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"); 

这回答了一个不同的问题,但希望这可以帮助有人读这个。 我正在寻找一个稍微不同的问题,这是我的解决scheme:

如果试图找出一个OBJECT(不是类)是否有属性,

 OBJECT.GetType().GetProperty("PROPERTY") != null 

如果(但不仅仅是)属性存在,则返回true。

在我的情况下,我在一个ASP.NET MVC的部分视图,并希望渲染的东西,如果属性不存在,或属性(布尔)是真的。

 @if ((Model.GetType().GetProperty("AddTimeoffBlackouts") == null) || Model.AddTimeoffBlackouts) 

在这里帮了我。

有两种可能性。

你真的没有Label属性。

您需要调用适当的GetProperty重载并传递正确的绑定标志,例如BindingFlags.Public | BindingFlags.Instance BindingFlags.Public | BindingFlags.Instance

如果你的财产不公开,你将需要使用BindingFlags.NonPublic或其他适合你的用例的标志组合。 阅读引用的API文档以查找详细信息。

编辑:

ooops,只是注意到你在typeof(MyClass)上调用GetPropertytypeof(MyClass)是肯定没有Label属性的types。

如果你像我一样具有约束力:

 <%# Container.DataItem.GetType().GetProperty("Property1") != null ? DataBinder.Eval(Container.DataItem, "Property1") : DataBinder.Eval(Container.DataItem, "Property2") %> 

绑定接受的答案时出现此错误:“types不包含GetProperty的定义”。

这是我结束了:

 using System.Reflection; if (productModel.GetType().GetTypeInfo().GetDeclaredProperty(propertyName) != null) { }