获取用[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个元素。

你能帮我吗?感谢

获取用[JsonIgnore]属性标记的所有属性

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

这会选择属性的所有NamesIgnoreColumnAttribute attribute作为Array。使用!Attribute.IsDefined选择相反的。由于Attribute.IsDefined过滤与昂贵的GetCustomAttributes 相比,这比其他答案使用更少的资源

dynamic props = typeof(MyClass).GetProperties().Where(prop =>
Attribute.IsDefined(prop, typeof(IgnoreColumnAttribute))).Select(propWithIgnoreColumn => 
propWithIgnoreColumn.Name).ToArray;