反射和屬性

2021-09-03 05:57:49 字數 3452 閱讀 3670

?反射的概念

?反射遍歷成員

?用射呼叫型別成員

?屬性概念(attribute)

?屬性的例項

?自定議屬性

?三個屬性

二次編輯一次執行

一次編譯後

反射

反射是程式設計的讀取與型別相關聯的元資料的行為。通讀取元資料,可以了解它是什麼型別以及型別的成員。比如類中的屬性,方法,事件等。

所屬命名空間system.reflection

反射-反射成員名稱

class demo_class

public void method(string s)

public int i;

public string s }呼叫

static void main(string args)

,型別:",mi.name,mi.membertype .tostring ()); }

}執行結果

反射-用反射呼叫無參構造型別成員

class demo_class

}class program

; //方法的引數

methodinfo mi = t.getmethod(「method」, bf);//得到方法

console.writeline(mi.invoke(obj, methodpar)); }

} 反射-用反射呼叫有參構造型別成員

class demo_class

}class program

); //建構函式有參,型別為int

object obj = cons.invoke(net object);//傳入的構造引數, 得到物件

object methodpar = new object ; //方法的引數

methodinfo mi = t.getmethod(「method」, bf);//得到方法

console.writeline(mi.invoke(obj, methodpar)); }

} 屬性-attribute

attribute非property(類的成員)

屬性提供功能強大的方法以將宣告資訊與 c# **(型別、方法、屬性等)相關聯。

屬性與程式實體關聯後,即可在執行時使用名為「反射」的技術查詢屬性。

屬性以兩種形式出現:

1.一種是在公共語言執行庫 (clr) 中定義的屬性。

2.另一種是可以建立的用於向**中新增附加資訊的自定義屬性。此資訊可在以後以程式設計方式檢索。

屬性具有以下特點:

1.屬性可向程式中新增元資料。元資料是嵌入程式中的資訊,如編譯器指令或資料描述。

2.程式可以使用反射檢查自己的元資料。

3.通常使用屬性與 com 互動。

乙個例子:

[system.runtime.interopservices.dllimportattribute("user32.dll", entrypoint = "messageboxw")]

public static extern int messageboxw([system.runtime.interopservices.inattribute()] system.intptr hwnd, [system.runtime.interopservices.inattribute()] [system.runtime.interopservices.marshalasattribute(system.runtime.interopservices.unmanagedtype.lpwstr)] string lptext, [system.runtime.interopservices.inattribute()] [system.runtime.interopservices.marshalasattribute(system.runtime.interopservices.unmanagedtype.lpwstr)] string lpcaption, uint utype);

static void main(string args)

自定義屬性

通過定義乙個屬性類,可以建立您自己的自定義屬性。該屬性類直接或間接地從system. attribute 派生,有助於方便快捷地在元資料中標識屬性定義。假設您要用編寫類或結構的程式設計師的名字標記類和結構。

[system.attributeusage(system.attributetargets.class | system.attributetargets.struct,allowmultiple=true ,inherited =true ) ] //author屬性只能用於類和結構,allowmultiple是否允許多次用屬性,inherited是這個屬性是滯延續到子類。

public class author : system.attribute

}[author(「張三」, version =2.0)]//張三是author的建構函式的引數,version是字段

class sampleclass

三個特別的屬性

1.attributeusage屬性(上面的例子已經演示)

2.conditional屬性

3.obsolete屬性

三個特別的屬性- conditional

條件方法必須是類或結構宣告中的方法,而且必須具有 void 返回型別。

#define trace_on //這行標識**決定著紅色**的執行與否。

using system;

using system.diagnostics;

namespace r_a_demo

}public class programclass

} }

另一種用法

#define trace_on

using system;

using system.diagnostics;

namespace r_a_demo

#endif }

public class programclass

} }

三個特別的屬性- obsolete

[system.obsolete("use class b")] //類會被在例項化時警告

class a

}class b

[system.obsolete("use newmethod", true)] //不可編譯

public void newmethod() }

一句話總結:

反射:利用一次編譯後的結果,反得到型別和型別成員。

屬性(attribute):額外給其他型別新增資訊的型別。

反射和屬性

反射的概念 反射遍歷成員 用射呼叫型別成員 屬性概念 attribute 屬性的例項 自定議屬性 三個屬性 二次編輯一次執行 一次編譯後 反射 反射是程式設計的讀取與型別相關聯的元資料的行為。通讀取元資料,可以了解它是什麼型別以及型別的成員。比如類中的屬性,方法,事件等。所屬命名空間system.r...

反射和屬性

反射的概念 反射遍歷成員 用射呼叫型別成員 屬性概念 attribute 屬性的例項 自定議屬性 三個屬性 二次編輯一次執行 一次編譯後 反射 反射是程式設計的讀取與型別相關聯的元資料的行為。通讀取元資料,可以了解它是什麼型別以及型別的成員。比如類中的屬性,方法,事件等。所屬命名空間system.r...

反射獲取和設定屬性值

單個獲取 根據屬性名獲取屬性值 param fieldname param object return private string getfieldvaluebyfieldname string fieldname,object object catch exception e 根據屬性名設定屬性...