在C#中,找出一个类是否具有属性的最佳方法是什么(使用反射)

时间:2012-02-06 12:34:25

标签: c# reflection

我有一个班级

 public class Car
 {
       public string Name {get;set;}
       public int Year {get;set;}
 }

在单独的代码中,我有一个字段名称作为字符串(让我们使用“年”)作为例子。

我想做这样的事情

   if (Car.HasProperty("Year")) 

可以判断汽车对象上是否有“年”字段。这将返回true。

   if (Car.HasProperty("Model"))

会返回false。

我看到代码循环遍历属性,但想知道是否有更简洁的方法来确定是否存在单个字段。

2 个答案:

答案 0 :(得分:16)

这种扩展方法应该这样做。

static public bool HasProperty(this Type type, string name)
{
    return type
        .GetProperties(BindingFlags.Public | BindingFlags.Instance)
        .Any(p => p.Name == name);
}

如果要检查非实例属性,私有属性或其他选项,可以调整该语句中的BindingFlags值。您的使用语法不完全是您提供的。代替:

if (typeof(Car).HasProperty("Year"))

答案 1 :(得分:9)

由于您似乎只关注public属性,Type.GetProperty()可以完成此任务:

if (typeof(Car).GetProperty("Year") != null) {
    // The 'Car' type exposes a public 'Year' property.
}

如果您想进一步抽象上面的代码,可以在Type class上编写扩展方法:

public static bool HasPublicProperty(this Type type, string name)
{
    return type.GetProperty(name) != null;
}

然后像这样使用它:

if (typeof(Car).HasPublicProperty("Year")) {
    // The 'Car' type exposes a public 'Year' property.
}

如果您还想检查是否存在非public属性,则必须调用带有BindingFlags参数的Type.GetProperties()覆盖,并将结果过滤为大卫M在他的回答中做了。