程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> [你必須知道的.NET] 第三回:歷史糾葛:特性和屬性(3)

[你必須知道的.NET] 第三回:歷史糾葛:特性和屬性(3)

編輯:關於C語言

5. 經典示例

5.1 小菜一碟

啥也不說了,看注釋吧。

using System;
using System.Reflection; //應用反射技術獲得特性信息

namespace Anytao.Net
{
//定制特性也可以應用在其他定制特性上,
//應用AttributeUsage,來控制如何應用新定義的特性
[AttributeUsageAttribute(AttributeTargets.All, //可應用任何元素
AllowMultiple = true, //允許應用多次
Inherited = false)] //不繼承到派生類
//特性也是一個類,
//必須繼承自System.Attribute類,
//命名規范為:"類名"+Attribute。
public class MyselfAttribute : System.Attribute
{
//定義字段
private string _name;
private int _age;
private string _memo;

//必須定義其構造函數,如果不定義有編譯器提供無參默認構造函數
public MyselfAttribute()
{
}
public MyselfAttribute(string name, int age)
{
_name = name;
_age = age;
}

//定義屬性
//顯然特性和屬性不是一回事兒
public string Name
{
get { return _name == null ? string.Empty : _name; }
}

public int Age
{
get { return _age; }
}

public string Memo
{
get { return _memo; }
set { _memo = value; }
}

//定義方法
public void ShowName()
{
Console.WriteLine("Hello, {0}", _name == null ? "world." : _name);
}
}

//應用自定義特性
//可以以Myself或者MyselfAttribute作為特性名
//可以給屬性Memo賦值
[Myself("Emma", 25, Memo = "Emma is my good girl.")]
public class Mytest
{
public void SayHello()
{
Console.WriteLine("Hello, my.Net world.");
}
}

public class Myrun
{
public static void Main(string[] args)
{
//如何以反射確定特性信息
Type tp = typeof(Mytest);
MemberInfo info = tp;
MyselfAttribute myAttribute =
(MyselfAttribute)Attribute.GetCustomAttribute(info, typeof(MyselfAttribute));
if (myAttribute != null)
{
//嘿嘿,在運行時查看注釋內容,是不是很爽
Console.WriteLine("Name: {0}", myAttribute.Name);
Console.WriteLine("Age: {0}", myAttribute.Age);
Console.WriteLine("Memo of {0} is {1}", myAttribute.Name, myAttribute.Memo);
myAttribute.ShowName();
}

//多點反射
object obj = Activator.CreateInstance(typeof(Mytest));

MethodInfo mi = tp.GetMethod("SayHello");
mi.Invoke(obj, null);
Console.ReadLine();
}
}
}

啥也別想了,自己做一下試試。

5.2 他山之石

MSDN認為,特性 (Attribute) 描述如何將數據序列化,指定用於強制安全性的特性,並限制實時 (JIT) 編譯器的優化,從而使代碼易於調試。屬性 (Attribute) 還可以記錄文件名或代碼作者,或在窗體開發階段控制控件和成員的可見性。

dudu Boss收藏的系列文章《Attribute在.Net編程中的應用》,給你應用方面的啟示會很多,值得研究。

亞歷山大同志 的系列文章《手把手教你寫ORM(六)》中,也有很好的诠釋。

idior的文章《Remoting基本原理及其擴展機制》也有收獲,因此補充。

6. 結論

Attribute是.NET引入的一大特色技術,但在博客園中討論的不是很多,所以拿出自己的體會來分享,希望就這一技術要點進行一番登堂入室的引導。更深層次的應用,例如序列化、程序安全性、設計模式多方面都可以挖掘出閃耀的金子,這就是.Net在技術領域帶來的百變魅力吧。希望大家暢所欲言,來完善和補充作者在這方面的不全面和認知上的不深入,那將是作者最大的鼓勵和動力。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved