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

时间:2016-08-29 08:01:56

标签: c# .net reflection

我有一个带有属性列表的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个元素。

你能帮帮我吗? 感谢

3 个答案:

答案 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;