前言:使用反射也有幾年了,但是一直覺得,反這個概念很抽象,今天有時間就來總結下這個知識點。
1、為什麼需要反射:
最初使用反射的時候,作為小菜總是不理解,既然可以通過new 乙個物件的方式得到物件,然後通過物件去呼叫屬性和方法,那麼為什麼還需要反射去呼叫呢?後來使用多了發現這就是乙個先繫結還是後繫結的問題,很多初使用反射的開發人員通常都會有類似這種疑慮:既然在開發時就能夠寫好**,幹嘛還放到執行期去做,不光繁瑣,而且效率也受影響。博主覺得主要是適用性的問題,如果你的系統沒有那麼高的擴充套件性和靈活性要求,你大可不必考慮反射。但在架構設計時,很多東西都需要考慮復用性,並且在某些特定的場景下你得不到具體的類時,你就必須用到反射。博主總結了下自己使用過的反射場景:
(1)有時不知道具體的型別,可以通過dll去得到類的物件;
(2)某些特殊方法,傳過來的是泛型類,需要通過反射處理某些特殊的業務;
(3)通用方法datatable和list的相互轉化時需要用到反射;
2、如何使用反射:
(1)反射dll得到類成員:
在乙個未知的dll裡面有乙個person類
public通過反射dll得到person類class
person
public
int age
public
void
sayhello()
public
static
string mystaticpro
public
static
void
mystatic()
}
static得到結果void main(string
args)
console.writeline(
"");
//預設得到類下面的所有public屬性
var lstproperty =otype.getproperties();
foreach (var oprop in
lstproperty)
console.writeline(
"");
//預設得到類下面的所有public欄位
var lstfield =otype.getfields();
foreach (var ofield in
lstfield)}}
console.readkey();
}
(2)反射物件的私有成員:
一般私有屬性的用法比較少,我們就以私有欄位為例來說明,還是上面的例子:
(3)反射物件的靜態成員:
staticvoid main(string
args)
console.writeline(
"");
//預設得到類下面的所有public欄位
還有列舉型別等等就不一一介紹了,基本上都是在bindingflags這個上面做處理。
(4)反射得到物件以及物件的操作:
反射得到物件的方法主要有兩種
public物件屬性的取值和賦值:static t getmodel(t omodel)
).invoke(new
object );//
反射得到泛型類的實體
//得到物件的方法二:
model = (t)activator.createinstance(typeof
(t));
//邏輯處理......
return
model;
}
//list集合轉換為datatable
public
static datatable listfilltable(object
obj)
var objlist = obj as
ilist;
if (objlist == null || objlist.count <= 0
)
var ttype = objlist[0
]; datatable dt = new
datatable(ttype.gettype().name);
datacolumn column;
datarow row;
system.reflection.propertyinfo mypropertyinfo = ttype.gettype().getproperties(bindingflags.public |bindingflags.instance);
foreach (var t in
objlist)
row =dt.newrow();
for (int i = 0, j = mypropertyinfo.length; i < j; i++)
else
dt.columns.add(column);
}row[name] = pi.getvalue(t, null
); }
dt.rows.add(row);
}return
dt; }
C 基礎系列 反射筆記
前言 使用反射也有幾年了,但是一直覺得,反這個概念很抽象,今天有時間就來總結下這個知識點。1 為什麼需要反射 最初使用反射的時候,作為小菜總是不理解,既然可以通過new 乙個物件的方式得到物件,然後通過物件去呼叫屬性和方法,那麼為什麼還需要反射去呼叫呢?後來使用多了發現這就是乙個先繫結還是後繫結的問...
C 基礎系列 反射的原理
反射 reflection 的內容在部落格中已經寫了一篇,什麼是反射,反射的使用,反射優缺點總結 在面試中突然被問道反射的原理,按照理解反射就是在reflection命名空間和物件的type物件獲取類的方法 屬性 特性等成員資訊,但是又被問道為什麼可以獲取這些成員資訊?就是反射機制依據的是什麼,讓其...
C 基礎 反射
反射指程式可以訪問 檢測和修改它本身狀態或行為的一種能力。程式集包含模組,而模組包含型別,型別又包含成員。反射則提供了封裝程式集 模組和型別的物件。您可以使用反射動態地建立型別的例項,將型別繫結到現有物件,或從現有物件中獲取型別。然後,可以呼叫型別的方法或訪問其字段和屬性。優點 1 反射提高了程式的...