2014-01-31 84 views
2

如何使用某種訂單屬性標記屬性以幫助我遍歷它們以便讀取分隔文件。如何將屬性添加到屬性並使用它來訂購成員

這些類是爲每一列創建一個屬性,我想編寫一個例程來處理它,而不是手工完成。

喜歡的東西:

[Order(1)] 
public string Field1 { get; set; } 

[Order(2)] 
public string Field2 { get; set; } 

然後是這樣的:

MemberInfo[] myMembers = myType.GetMembers() 
    .OrderBy(something here or in a loop); 

有什麼想法?

回答

3

你需要一個OrderAttribute類:

public class OrderAttribute : Attribute 
{ 
    public OrderAttribute(int value) 
    { 
     this.Value = value; 
    } 

    public int Value { get; private set; } 
} 

然後,您可以通過屬性命令如下:

MemberInfo[] myMembers = typeof(object).GetMembers() 
    .OrderBy(m => m.GetCustomAttribute<OrderAttribute>().Value); 

這是如何做到這一點只是一個簡單的例子,我建議檢查你的成員是否確實有這個屬性,如果沒有,或者假設一個默認值,則拋出一個適當的錯誤

+0

你已經有了一個可能的'NullReferenceException'那裏,如果其中一個成員沒有一個'OrderAttribute' – tvanfosson

+0

謝謝,我只是添加註釋關於你的評論! –

+0

@MartinBooth,謝謝,這正是我想要的。 –

2

使用MemberInfo上的CustomAttributes屬性獲取OrderAttribute並選擇它的排序值。

var members = myType.GetMembers() 
        .OrderBy(m => m.CustomAttributes 
            .OfType(typeof(OrderAttribute)) 
            .FirstOrDefault(a => a.Value)) 
3

你的建議是可行的。

創建一個屬性:

public class OrderAttribute : Attribute 
{ 
    public int Order { get; private set; } 
    public OrderAttribute(int order) 
    { 
     Order = order; 
    } 
} 

然後在您的通話排序依據通過反射得到OrderAttribute.Order領域也。 將它放在自己的方法中或在PropertyInfo上創建擴展方法可能會更好。

所以它應該是這樣的:

MemberInfo[] myMembers = myType.GetMembers() 
.OrderBy(m => m.GetAttribute<OrderAttribute>().Order); 

我創建了一個通用的擴展方法來處理屬性檢索。

public static TAttribute GetAttribute<TAttribute>(this object obj) 
     where TAttribute : Attribute 
    { 
     return obj.GetType().GetAttribute<TAttribute>(); 
    } 


    public static TAttribute GetAttribute<TAttribute>(this ICustomAttributeProvider propInfo, bool inherit = true) 
     where TAttribute : Attribute 
    { 
     return (TAttribute)propInfo.GetCustomAttributes(typeof(TAttribute), inherit).FirstOrDefault(); 
    } 
+3

如果有人不使用.net framework 4.5,那麼你的擴展方法肯定是有用的!如果您是http://msdn.microsoft.com/zh-cn/library/system.reflection,請查看這些內置擴展方法。customattributeextensions(v = vs.110).aspx –

+0

感謝Martin,我很高興現在學習它的.net框架的一部分 –

+0

謝謝,Martin,以及。絕對有用的信息。 –

0

我會做這樣的:

var members = myType.GetMembers() 
       .Where(m => Attribute.IsDefined(m, typeof(OrderAttribute))) 
       .OrderBy(m => m.GetCustomAttribute<OrderAttribute>().Order); 

我是否OrderAttribute如此定義:它不會拋出空引用異常。

OrderAttribute.cs

public class OrderAttribute : Attribute 
{ 
    public OrderAttribute(int order) 
    { 
     Order = order; 
    } 

    public int Order { get; private set; } 
}