【问题标题】:Filter PropertyInfo by attribute enum value按属性枚举值过滤 PropertyInfo
【发布时间】:2014-11-03 09:40:34
【问题描述】:

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

[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>();

现在我有了所有具有我的自定义属性的属性的列表,我怎样才能得到哪个属性的 FieldFor 值为 Name??

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

【问题讨论】:

    标签: c# .net linq enums


    【解决方案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);
    

    【讨论】:

    • 代替 foreach,我可以在 linq 查询中执行此操作吗?
    • 我刚刚意识到我自己没有公共财产,呵呵!谢谢,完美解答
    【解决方案2】:

    你可以这样做:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-13
      • 2017-05-28
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      相关资源
      最近更新 更多