我试试就知道了,如果一个属性一类的存在,我想这一点:
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);
}
你的方法是这样的:
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")
b)将在延伸System.Type
public static bool HasProperty(this Type obj, string propertyName)
{
return obj.GetProperty(propertyName) != null;
}
和
typeof(MyClass).HasProperty("Label");
这回答一个不同的问题:
如果想弄清楚如果一个对象(而不是类)有一个属性,
OBJECT.GetType().GetProperty("PROPERTY") != null
返回true,如果(但不仅当)属性存在。
就我而言,我是在一个ASP.NET MVC局部视图,想要呈现的东西,如果任一属性不存在,或者属性(布尔)是真实的。
@if ((Model.GetType().GetProperty("AddTimeoffBlackouts") == null) ||
Model.AddTimeoffBlackouts)
这里帮我。
编辑:现在,它可能是明智的使用nameof
操盘字符串化的属性名。
有两种可能性。
你真的没有Label
属性。
你需要调用适当的getProperty过载 ,并通过正确的绑定标志,如BindingFlags.Public | BindingFlags.Instance
BindingFlags.Public | BindingFlags.Instance
如果你的财产是不公开的,你将需要使用BindingFlags.NonPublic
或标志的一些其他组合,适合您的使用情况。 阅读参考API文档找到细节。
编辑:
哎呀,刚才注意到你打电话GetProperty
上typeof(MyClass)
。 typeof(MyClass)
是Type
它肯定没有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.
}
就我而言,我通过从表单提交的属性运行,也如果条目为空默认值来使用 - 所以我需要知道,如果有使用的值 - 我的前缀模型中的我所有的默认值与默认因此,所有我需要做的是检查是否有是与开始的属性。