我有一个带有属性列表的MyClass类。
public class MyClass
{
[Attribute1]
[Attribute2]
[JsonIgnore]
public int? Prop1 { get; set; }
[Attribute1]
[Attribute8]
public int? Prop2 { get; set; }
[JsonIgnore]
[Attribute2]
public int Prop3 { get; set; }
}
我想检索没有用[JsonIgnore]属性标记的属性。
JsonIgnore是http://www.newtonsoft.com/json
的属性所以,在这个例子中,我想拥有属性“Prop2”。
我试过
var props = t.GetProperties().Where(
prop => Attribute.IsDefined(prop, typeof(JsonIgnore)));
或
var props = t.GetProperties().Where(
prop => Attribute.IsDefined(prop, typeof(Newtonsoft.Json.JsonIgnoreAttribute)));
其中 t 是MyClass的类型,但该方法返回0个元素。
你能帮帮我吗? 感谢答案 0 :(得分:4)
typeof(MyClass).GetProperties()
.Where(property =>
property.GetCustomAttributes(false)
.OfType<JsonIgnoreAttribute>()
.Any()
);
在GetCustomAttibutes
调用中指定类型可能会更高效,此外,您可能希望逻辑可重用,以便您可以使用此辅助方法:
static IEnumerable<PropertyInfo> GetPropertiesWithAttribute<TType, TAttribute>()
{
Func<PropertyInfo, bool> matching =
property => property.GetCustomAttributes(typeof(TAttribute), false)
.Any();
return typeof(TType).GetProperties().Where(matching);
}
用法:
var properties = GetPropertyWithAttribute<MyClass, JsonIgnoreAttribute>();
修改强> 我不确定,但你可能会在没有属性的属性之后,所以你可以否定查找谓词:
static IEnumerable<PropertyInfo> GetPropertiesWithoutAttribute<TType, TAttribute>()
{
Func<PropertyInfo, bool> matching =
property => !property.GetCustomAttributes(typeof(TAttribute), false)
.Any();
return typeof(TType).GetProperties().Where(matching);
}
或者您可以使用简单的库,例如 Fasterflect :
typeof(MyClass).PropertiesWith<JsonIgnoreAttribute>();
答案 1 :(得分:0)
属性在属性上,而不是类本身。因此,您需要迭代属性,然后尝试查找这些属性 -
foreach (var item in typeof(MyClass).GetProperties())
{
var attr = item.GetCustomAttributes(typeof(JsonIgnoreAttribute), false);
}
答案 2 :(得分:0)
这会选择Names
IgnoreColumnAttribute
作为attribute
的所有Array
属性。使用!Attribute.IsDefined
选择相反的选项。由于Attribute.IsDefined
过滤与昂贵的GetCustomAttributes
dynamic props = typeof(MyClass).GetProperties().Where(prop =>
Attribute.IsDefined(prop, typeof(IgnoreColumnAttribute))).Select(propWithIgnoreColumn =>
propWithIgnoreColumn.Name).ToArray;