[C#] 關於 System.Attribute 筆記

2012-10-23

 

最近在處理有關於對於Class 進行一些處理跟判斷,我發現System.Attribute 是一格方便的東西,

平常如果沒有在設計底層的東西會比較少碰到

2012-10-23_150141

簡單的說 Attribute 對與 C# 程式碼 (型別、方法和屬性,等等) 關聯的宣告式資訊提供了一個強大的方法。一旦和程式實體 (Entity) 產生關聯,屬性能夠在 Run Time 被查詢並且以任何的方法來使用。

直接來看看如何使用

首先我先建立一個叫做 IndexAttribute 並且繼承  System.Attribute

namespace MemoAttrProperty
{
public enum FieldType
{
String, DateTime, Int, Float
}
public class IndexAttribute : System.Attribute
{

/// <summary>
/// Index 的名稱
/// </summary>
public string IndexName { get; set; }

/// <summary>
/// 該Property 型態
/// </summary>
public FieldType FieldType { get; set; }

/// <summary>
/// Ctor
/// </summary>
/// <param name="indexName">Index 的名稱</param>
/// <param name="fieldType">該Property 型態</param>
public IndexAttribute(string indexName, FieldType fieldType)
{
IndexName = indexName;
FieldType = fieldType;
}
}
}


雖然這兩個資料都可以透過反射取得,不過基本上這就當作範例來看到
我對這繼承 Attribute Class 建立兩種Property ..一個叫做IndexName 另一個是一個eunm為 FieldType


所以這時候我可以對於一個我建立的Class 貼上這樣的標籤


public class User
{
[IndexAttribute("使用者系統編號", FieldType.String)]
public string Id { get; set; }

[IndexAttribute("使用者姓名", FieldType.String)]
public string Name { get; set; }

[IndexAttribute("使用者年齡", FieldType.Int)]
public int Age { get; set; }
}


 


這時候我可以透過反射的方法取得這Class 的Attribute資料:


 


protected void Button1_Click(object sender, EventArgs e)
{
User donma = new User();
donma.Id = "1";
donma.Age = 29;
donma.Name = "當麻許";

var res = GetAllProperties<User>(donma);

foreach (var re in res)
{
Response.Write(re+"<br />");
}
}


public string[] GetAllProperties<T>(T user)
{
var res = new List<string>();

var properties = user.GetType().GetProperties();
foreach (var propertyInfo in properties)
{

var r = propertyInfo.GetCustomAttributes(typeof(IndexAttribute), true);
foreach (IndexAttribute o in r)
{
res.Add("PropertyName:" + propertyInfo.Name + " , " + "PropertyValue:" + propertyInfo.GetValue(user, null) + " , " + "IndexName:" + o.IndexName + " , " + "FieldType:" + o.FieldType);
}

}

return res.ToArray();


}


 


因為是範例程式力求簡單,其中我就是把 User 這物件 傳入 GetAllProperties 這method 中,他會把該 物件的如果被IndexAttribute 給標示的Property 的 PropertyName , PropertyValue , 還有 IndexAttribute.IndexName , IndexAttribute.FieldType 給印出來..


結果:

2012-10-23_150921



參考文件:


http://msdn.microsoft.com/en-us/library/aa288454(v=vs.71).aspx
http://www.dotnetperls.com/attribute
http://www.dotblogs.com.tw/yc421206/archive/2012/05/06/72001.aspx


下載:



當麻許的超技八 2014 | Donma Hsu Design.