获取用[JsonIgnore]属性标记的所有属性
本文关键字:属性 获取 JsonIgnore | 更新日期: 2023-09-27 18:04:34
我有一个带有属性列表的类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个元素。
你能帮我吗?感谢
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>();
编辑:我不确定,但你可能在寻找没有属性的属性,所以你可以否定find谓词:
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>();
属性在属性上,而不是类本身。因此,您需要对属性进行迭代,然后尝试找到这些属性-
foreach (var item in typeof(MyClass).GetProperties())
{
var attr = item.GetCustomAttributes(typeof(JsonIgnoreAttribute), false);
}
这会选择属性的所有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;