C 基礎系列 反射筆記

2021-09-22 09:30:57 字數 3083 閱讀 1356

前言:使用反射也有幾年了,但是一直覺得,反這個概念很抽象,今天有時間就來總結下這個知識點。

1、為什麼需要反射:

最初使用反射的時候,作為小菜總是不理解,既然可以通過new 乙個物件的方式得到物件,然後通過物件去呼叫屬性和方法,那麼為什麼還需要反射去呼叫呢?後來使用多了發現這就是乙個先繫結還是後繫結的問題,很多初使用反射的開發人員通常都會有類似這種疑慮:既然在開發時就能夠寫好**,幹嘛還放到執行期去做,不光繁瑣,而且效率也受影響。博主覺得主要是適用性的問題,如果你的系統沒有那麼高的擴充套件性和靈活性要求,你大可不必考慮反射。但在架構設計時,很多東西都需要考慮復用性,並且在某些特定的場景下你得不到具體的類時,你就必須用到反射。博主總結了下自己使用過的反射場景:

(1)有時不知道具體的型別,可以通過dll去得到類的物件;

(2)某些特殊方法,傳過來的是泛型類,需要通過反射處理某些特殊的業務;

(3)通用方法datatable和list的相互轉化時需要用到反射;

2、如何使用反射:

(1)反射dll得到類成員:

在乙個未知的dll裡面有乙個person類

public

class

person

public

int age

public

void

sayhello()

public

static

string mystaticpro

public

static

void

mystatic()

}

通過反射dll得到person類

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)反射物件的靜態成員:

static

void 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 反射提高了程式的...