[C#] 關於 System.Attribute 筆記
最近在處理有關於對於Class 進行一些處理跟判斷,我發現System.Attribute 是一格方便的東西,
平常如果沒有在設計底層的東西會比較少碰到
簡單的說 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 給印出來..
參考文件:
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
下載: