1.元資料與反射
有關程式以及其型別的資料稱作元資料(也有叫做描述資料的資料),它儲存在程式的程式集中。乙個程式在執行時檢視自己程式的元資料或者其他程式的元資料的行為就叫做反射。
2.type類
type類包擴了我們程式使用的型別資訊:
成員成員型別
描述name
屬性型別的名字
namespace
屬性型別宣告的命名空間
assembly
屬性返回宣告型別的程式集。如果型別是泛型的,返回定義這個型別的程式集
getfields
方法返回型別的字段列表
getproperties
方法返回型別的屬性列表
getmethods
方法返回型別的方法列表
.......
......
........
propertyinfo型別,封裝了型別的屬性資訊;
❑constructorinfo型別,封裝了型別的建構函式資訊;
❑methodinfo型別,封裝了型別的方法資訊;
❑eventinfo型別,封裝了型別的事件資訊;
❑parameterinfo型別,封裝了方法和建構函式的引數資訊
經常使用的兩種方式獲取type物件:
type t=typeof(希望被獲取型別的物件)
type tt=型別物件.gettype();
namespace輸出的結果如圖:測試反射
static
void
printinfo(type t)
console.writeline(
"屬性資訊:");
propertyinfo propertyinfos =t.getproperties();
foreach (var propertyinfo in
propertyinfos)
console.writeline(
"方法資訊:");
methodinfo methodinfos =t.getmethods();
foreach (var method in
methodinfos)
console.writeline(
"********************===");}}
public
class
fatherclass
public
void
basemethod()
}public
class
derivedclass:fatherclass
public
void
derivedmethod()}}
繼承的一些資訊也被列印了出來。
3.通過getfield()屬性,反射列舉型別的字段。因為列舉獲取的field值得首項不是列舉中的業務字段,通過isspecialname進行區分
namespace執行結果:列舉型別的反射
}console.read();}}
enum
day
}
type中在vs中能點出來的屬性和方法一般是is...,get....,get....s。他們都繼承於memberinfo。memberinfo是乙個抽象類,它通過位標記(用[flags]特性標記的列舉)來進行區分,是filedinfo還是properityinfo等等。下面是在**中f12看到的membertype列舉。
// 摘要:好,初次認識反射,對於type獲取物件元資料資訊有了乙個基本了解。後面會繼續講解。// 標記每個已定義為 memberinfo 的派生類的成員型別。
[serializable]
[comvisible(true)]
[flags]
public enum membertypes
反射的本質 元資料
今天關於反射的爭論不少了,不過,個人覺得為了避免誤導新手,有必要談一下反射的本質。在我看來,反射的本質在於元資料,它是一種獲取和使用元資料的技術。反射 從字面上理解,可以認為是洞察和使用內部資訊的手段。microsoft等n公司對命名是非常有研究的。元資料是一種關於資料的資料,有點繞口,說白點就是一...
反射及元類
什麼是反射,其實是反省,自省的意思 反射指的是乙個物件應該具備,可以檢測,修改,增加自身屬性的能力 反射就是通過字串操作屬性 涉及的四個函式,這四個函式就是普通的內建函式 沒有雙下劃線,與print等等沒有區別 class person def init self,name,age,gender s...
反射與內省(一)Java
class類 很多的人 可以定義乙個person類 有年齡 性別 很多的車 可以定義乙個car類 有發動機,顏色,車輪 很多的類 可一定以為乙個class類 類名,構造方法,屬性,方法 得到class類的物件有三種方法 object類中的getclass 方法 類.class 通過class類的fo...