2014-11-03 55 views
0

我對我的每一個模型的一些自定義屬性,如下濾波器的PropertyInfo由屬性枚舉值

[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值?

我分別做兩個查詢,因爲我必須讓我的模型

回答

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); 
+0

,而不是一個foreach,我能做到這一點的LINQ查詢? – Gillardo 2014-11-03 09:48:02

+0

我剛剛意識到自己沒有公共財產,呃!謝謝,完美答案 – Gillardo 2014-11-03 09:58:31

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(); 
+0

也是一個很好的答案 – Gillardo 2014-11-03 09:59:24