按属性枚举值过滤PropertyInfo

时间:2014-11-03 09:40:34

标签: c# .net linq enums

我对每个模型都有一些自定义属性,如下所示

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class FieldAttribute : System.Attribute
{
    private FieldFor _fieldFor;

    public FieldAttribute(FieldFor fieldFor)
    {
        _fieldFor = fieldFor;
    }
}

FieldFor类型是一个枚举。所以我可以针对像这样的字段声明这个

[Field(FieldFor.Name)]
public string Name { get; set; }

现在要获取我的模型上具有此自定义属性的属性列表,我使用以下

List<PropertyInfo> props = new MyModel().GetType().GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(FieldAttribute))).ToList<PropertyInfo>();

现在我拥有具有自定义属性的所有属性的列表,如何获取哪个属性具有NameFor的FieldFor值?

我正在分别进行两个查询,因为我必须获取模型上许多属性的值

2 个答案:

答案 0 :(得分:1)

您可以使用GetCustomAttribute方法获取该属性,然后您可以访问其成员:

foreach(var prop in props)
{
    var fieldAttribute = prop.GetCustomAttribute<FieldAttribute>();
    var value = fieldAttribute.FieldFor;
}

添加一个公共属性以获得FieldFor的值会很有用。现在你只有一个私有字段。

public FieldFor FieldFor { get { return _fieldFor; } }

使用linq:

props.Where(x => x.GetCustomAttribute<FieldAttribute>().FieldFor == FieldFor.Name);

答案 1 :(得分:1)

你可以这样做:

var props = new MyModel()
    .GetType()
    .GetProperties()
    .Where(prop =>
        {
            var fieldAttribute = prop.GetCustomAttribute<FieldAttribute>();
            if (fieldAttribute != null)
            {
                return fieldAttribute.FieldFor == FieldFor.Name;
            }

            return false;
        })
    .ToList();