检查属性的一类存在(Check if a property exist in a class)

2019-07-21 08:40发布

我试试就知道了,如果一个属性一类的存在,我想这一点:

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

Answer 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正确地指出,在这一点上你的代码是寻找财产LabelSystem.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");


Answer 2:

这回答一个不同的问题:

如果想弄清楚如果一个对象(而不是类)有一个属性,

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

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

就我而言,我是在一个ASP.NET MVC局部视图,想要呈现的东西,如果任一属性不存在,或者属性(布尔)是真实的。

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

这里帮我。

编辑:现在,它可能是明智的使用nameof操盘字符串化的属性名。



Answer 3:

有两种可能性。

你真的没有Label属性。

你需要调用适当的getProperty过载 ,并通过正确的绑定标志,如BindingFlags.Public | BindingFlags.Instance BindingFlags.Public | BindingFlags.Instance

如果你的财产是不公开的,你将需要使用BindingFlags.NonPublic或标志的一些其他组合,适合您的使用情况。 阅读参考API文档找到细节。

编辑:

哎呀,刚才注意到你打电话GetPropertytypeof(MyClass)typeof(MyClass)Type它肯定没有Label属性。



Answer 4:

我得到这个错误:“类型不包含定义的getProperty”搭售接受的答案的时候。

这就是我结束了:

using System.Reflection;

if (productModel.GetType().GetTypeInfo().GetDeclaredProperty(propertyName) != null)
{

}


Answer 5:

如果绑定,好像我是:

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


Answer 6:

我不能确定为什么这需要上下文的,所以这可能不是你返回足够的信息,但是这是我能够做到:

if(typeof(ModelName).GetProperty("Name of Property") != null)
{
//whatevver you were wanting to do.
}

就我而言,我通过从表单提交的属性运行,也如果条目为空默认值来使用 - 所以我需要知道,如果有使用的值 - 我的前缀模型中的我所有的默认值与默认因此,所有我需要做的是检查是否有是与开始的属性。



文章来源: Check if a property exist in a class