c 之Attribute特性的原理

2022-02-25 02:46:50 字數 2824 閱讀 2909

當我們在visual studio新增乙個自定義控制項時,它都會給我們以下預設的**。

[defaultproperty("text")]   

[toolboxdata("<:webcustomcontrol1 runat=server>")]

public class webcustomcontrol1 : webcontrol

set

}

protected override void rendercontents(htmltextwriter output)

} [defaultproperty("text")]

[toolboxdata("<:webcustomcontrol1 runat=server>")]

public class webcustomcontrol1 : webcontrol

set}

protected override void rendercontents(htmltextwriter output)

}

在這個控制項中有個預設的屬性"text",在這個屬性有[defaultvalue("")]相應的特性,來給該屬性設定預設值。以前一直

想不明白微軟是怎麼實現的,直到昨天看了《你必須知道的.net》中講「特性」這一章受到了啟發。於是我馬上去試試,

還真的可以。廢話少說,來看看我的實現方法。

首先我們先建立乙個自己預設值特性selfdefaultvalueattribute:

[attributeusageattribute(attributetargets.all,   //     可以對任何應用程式元素應用屬性       

allowmultiple = true, // 允許指定多個例項

inherited = false)] // 不繼承到派生類

public class selfdefaultvalueattribute : system.attribute

public object attrvalue

} [attributeusageattribute(attributetargets.all, // 可以對任何應用程式元素應用屬性

allowmultiple = true, // 允許指定多個例項

inherited = false)] // 不繼承到派生類

public class selfdefaultvalueattribute : system.attribute

public object attrvalue

}

接著我們建立乙個自己的控制項父類selfcontrol

public  class selfcontrol      

else

} }

[selfdefaultvalue("")]

public virtual string name

}

public class selfcontrol

else}}

[selfdefaultvalue("")]

public virtual string name

}

這個控制項只有乙個屬性"name"預設值為空。說明一下的是,在這裡我們用到了反射的機制,所以我們要引入空間:

system.reflection。

現在,我們就可以建立屬於自己定義的控制項了。

好了,終於完成了。那我們現在來測試一下。

public class myrun   

",selfcon.width);

console.writeline("控制項高度:", selfcon.height);

console.writeline("控制項名字:", selfcon.name);

console.writeline("控制項標籤:", selfcon.htmltag);

console.writeline("控制項文字:", selfcon.text);

console.readline();

}

} public class myrun

",selfcon.width);

console.writeline("控制項高度:", selfcon.height);

console.writeline("控制項名字:", selfcon.name);

console.writeline("控制項標籤:", selfcon.htmltag);

console.writeline("控制項文字:", selfcon.text);

console.readline();}}

最後的結果就是:

view plaincopy to clipboardprint?

控制項寬度:100

控制項高度:0

控制項名字:

控制項標籤:

控制項文字:testcontrol

控制項寬度:100

控制項高度:0

控制項名字:

控制項標籤:

控制項文字:testcontrol

由於我們沒給控制項的高度設定預設值、高度型別int,所以高度預設為0;而名字和標籤型別為string,所以為空。

C 高階之特性(Attribute)

相信只要是用過.net mvc的開發都用過特性,例如最基礎的httpmethodattribute特性,用來給介面進行請求方式限定的,等等諸如此類的特性,數不勝數。那麼什麼是特性?特性就是乙個類,直接或者間接繼承自attribute,特性本身沒有任何作用。特性的使用方法有兩種 range 0,10 ...

C 特性Attribute學習

起初一直糾結於如何呼叫特性附著在下面那個成員的值,後來發現不需要呼叫,通過反射載入的時候是自動繫結上去的,即 獲得成員物件之後,有乙個方法可以獲得特性標籤。其實從類庫提供者,和類庫使用者的角度,分開來看就很容易理解了。類庫提供者 myclasslib類 myclasslib類有乙個showstrin...

C 特性Attribute學習

起初一直糾結於如何呼叫特性附著在下面那個成員的值,後來發現不需要呼叫,通過反射載入的時候是自動繫結上去的,即 獲得成員物件之後,有乙個方法可以獲得特性標籤。其實從類庫提供者,和類庫使用者的角度,分開來看就很容易理解了。類庫提供者 myclasslib類 myclasslib類有乙個showstrin...