检查一个属性是否存在于一个类中
我尝试了解一个类是否存在一个属性,我试过这个:
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)
上调用GetProperty
。 typeof(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) { }
- 什么时候应该使用Tracing vs Logger.NET,Enterprise Library,log4net或Ukadc.Diagnostics?
- 在所有组件中查找types
- 如何反转BooleanToVisibilityConverter?
- 如何在.NET中启用程序集绑定失败日志logging(Fusion)
- 你能用一个好的C#示例来解释Liskovreplace原理吗?
- 使用vs2010将C ++ / CLI项目更改为另一个不是4.0的框架
- 有一个原因,为什么用XmlInclude装饰的基类仍然会在序列化时抛出一个types未知的exception?
- XSLT是否具有Split()函数?
- 在.NET中将数组转换为HashSet <T>