反射在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);
例二:根據有引數的構造器建立物件
namespacetestspace
}}…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提供了一些靜態方法來動態建立乙個委託,比如乙個委託:
namespacetestspace
public
string getvalue(string
value)
}}
使用示例:
testclass obj = newtestclass();
//獲取型別,實際上這裡也可以直接用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中每乙個型別 包括類 結構 委託 介面和列舉等 的成員,包括 方法 屬性 事件,以及建構函式等。還可以獲得每個成員的名稱 限定符和引數等。有了反射,即可對每乙個型別瞭如指掌。如果獲得了建構函式的資訊,即可直 接建...