我有一个班级
public class Car
{
public string Name {get;set;}
public int Year {get;set;}
}
在单独的代码中,我有一个字段名称作为字符串(让我们使用“年”)作为例子。
我想做这样的事情
if (Car.HasProperty("Year"))
可以判断汽车对象上是否有“年”字段。这将返回true。
if (Car.HasProperty("Model"))
会返回false。
我看到代码循环遍历属性,但想知道是否有更简洁的方法来确定是否存在单个字段。
答案 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在他的回答中做了。