C 高階之路(七)反射的應用

2022-07-07 10:12:17 字數 3651 閱讀 7834

反射在c#中的應用還是很多的,但它對**的效能有一定影響。

使用反射來呼叫型別或者觸發方法,或者訪問乙個字段或者屬性時clr 需要做更多的工作:校驗引數,檢查許可權等等,所以速度是非常慢的。所以盡量不要使用反射進行程式設計,對於打算編寫乙個動態構造型別(晚繫結)的應用程式,可以採取以下的幾種方式進行代替:

1、通過類的繼承關係。讓該型別從乙個編譯時可知的基礎型別派生出來,在執行時生成該型別的乙個例項,將對其的引用放到其基礎型別的乙個變數中,然後呼叫該基礎型別的虛方法。

2、通過介面實現。在執行時,構建該型別的乙個例項,將對其的引用放到其介面型別的乙個變數中,然後呼叫該介面定義的虛方法。

3、通過委託實現。讓該型別實現乙個方法,其名稱和原型都與乙個在編譯時就已知的委託相符。在執行時先構造該型別的例項,然後在用該方法的物件及名稱構造出該委託的例項,接著通過委託呼叫你想要的方法。這個方法相對與前面兩個方法所作的工作要多一些,效率更低一些。

system.activator提供了方法來根據型別動態建立物件,比如建立乙個datatable:

type  t  =  type.gettype("

system.data.datatable,system.data,version=1.0.3300.0, culture=neutral, publickeytoken=b77a5c561934e089");

datatable table = (datatable)activator.createinstance(t);

例二:根據有引數的構造器建立物件

namespace

testspace

}}…type t =type.gettype(「testspace.testclass」);

object constructparms = new

object ; //

構造器引數

testclass obj =(testclass)activator.createinstance(t,constructparms);

把引數按照順序放入乙個object陣列中即可

//

獲取型別資訊

type t = type.gettype("

testspace.testclass");

//構造器的引數

object constuctparms = new

object ;

//根據型別建立物件

object dobj =activator.createinstance(t, constuctparms);

//獲取方法的資訊

methodinfo method = t.getmethod("

getvalue");

//呼叫方法的一些標誌位,這裡的含義是public並且是例項方法,這也是預設的值

bindingflags flag = bindingflags.public |bindingflags.instance;

//getvalue方法的引數

object parameters = new

object ;

//呼叫方法,用乙個object接收返回值

object returnvalue = method.invoke(dobj, flag, type.defaultbinder, parameters, null);

委託是c#中實現事件的基礎,有時候不可避免的要動態的建立委託,實際上委託也是一種型別:system.delegate,所有的委託都是從這個類派生的

system.delegate提供了一些靜態方法來動態建立乙個委託,比如乙個委託:

namespace

testspace

public

string getvalue(string

value)

}}

使用示例:

testclass  obj  =  new

testclass();

//獲取型別,實際上這裡也可以直接用typeof來獲取型別

type t =type.gettype(「testspace.testclass」);

//建立**,傳入型別、建立**的物件以及方法名稱

testdelegate method =(testdelegate)delegate.createdelegate(t,obj,」getvalue」);

string returnvalue = method(「hello」);

這裡要注意的是,你傳入的t模型與你資料庫中的模型要是相同的。

///

///批量加入mysql資料庫

//////

//////

///public

static

int insertbylist(listlist, string connectionstring, string

tablename),"

); }

sb.remove(sb.tostring().lastindexof(',

'), 1);"

) values ");

foreach (var item in

list)

if (pi.propertytype.name == "

nullable`1

")//

可空型別,判定是否為空

else

}else

}sb.remove(sb.tostring().lastindexof(',

'), 1);"

),"); }

sb.remove(sb.tostring().lastindexof(',

'), 1);"

;");"

select @@identity");

using (var con = new

mysqlconnection(connectionstring))

catch

(exception ex)}}

return

count;

}

這裡model是要驗證的例項

type type  =model.gettype();

bool res= false;//

判斷例項是否是已經賦值, false 未賦值 true 已經賦值

foreach (var item in

type.getproperties())

;

if(skiplist.contains(item.name))

var typethis =item.propertytype;

var valuedefault = typethis.isvaluetype ? activator.createinstance(typethis) : null

;

var gggggg =item.getvalue(model);

if (valuedefault==null

)

}//如果直接使用== 其實是對引用位址的對比

else

if (valuedefault.tostring() !=gggggg.tostring())

}

c 高階技術 反射

反射?難道是物理中光的反射?no no no 這個 反射 和物理一點關係都沒有!那什麼是反射呢?我個人的理解是 在程式中 動態的新增程式的功能 新增dll檔案 無需在源 中新增 從而實現為程式的功能 公升級 說的有些官方了 下面我舉幾個例子 我們都玩過遊戲 就拿我以前玩的qq飛車來說 遊戲廠商會隔一...

Python學習之路七 高階知識

模組也就是子程式,它的主函式用於定義,包括定義函式 類和變數。如果模組包含測試 則應該將這部分 放置在檢查name main 在pythonpath中找到的模組都可以匯入。語句import foo可以匯入儲存在foo.py檔案中的模組。包 包是包含模組的模組,包是作為包含init.py檔案的目錄來實...

C 反射技術應用

反 射 reflection 是.net中的重要機制,通過放射,可以在執行時獲得.net中每乙個型別 包括類 結構 委託 介面和列舉等 的成員,包括 方法 屬性 事件,以及建構函式等。還可以獲得每個成員的名稱 限定符和引數等。有了反射,即可對每乙個型別瞭如指掌。如果獲得了建構函式的資訊,即可直 接建...