?反射的概念
?反射遍歷成員
?用射呼叫型別成員
?屬性概念(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 根據屬性名設定屬性...