高效实现C#反射创建对象的3种方法及优化技巧
浣犳槸涓嶆槸鎬诲惉璇村弽灏勫緢鎱紵
锛堟柊鎵嬪繀鐪嬶細浠婂ぉ鎵嬫妸鎵嬫暀浣犵敤鍙嶅皠閫犵伀绠紝杩樹笉鐑PU锛侊級
涓婂懆鏈変釜鑰佸紵闂垜锛?鐢ㄥ弽灏勫垱寤哄璞℃槸涓嶆槸姣旇湕鐗涜繕鎱紵鎴戝仛涓畝鍗曠殑鎻掍欢绯荤粺閮藉崱鎴怭PT锛? 杩欓棶棰樺氨鍍忔柊鎵嬪浣曞揩閫熸定绮変竴鏍烽珮棰戔€斺€斺€?strong>鈥嬪叾瀹炲弽灏勫彲浠ュ揩鍒伴璧凤紝鍏抽敭鐪嬩綘鎬庝箞鐢ㄢ€?/strong>鈥嬨€傛帴涓嬫潵杩欎笁涓粷娲伙紝閮芥槸鎴戠敤鐪熼噾鐧介摱鐨勭嚎涓婁簨鏁呮崲鏉ョ殑缁忛獙銆?/p>
鏂规硶涓€锛氬熀纭€鐗堚€斺€擜ctivator.CreateInstance
锛堥€傚悎涓存椂鐢紝浣嗗埆鍦ㄥ惊鐜噷鐜╃伀锛?/p>
csharp澶嶅埗// 鏃犺剳鎿嶄綔涓よ娴?/span> Type type = typeof(Student); object obj = Activator.CreateInstance(type);
鈥?strong>鈥嬩紭鐐光€?/strong>鈥嬶細
- 浠g爜閲忓皯鍒扮瑧鍑哄0
- 涓嶉渶瑕佺煡閬撴瀯閫犲嚱鏁板弬鏁?/li>
鈥?strong>鈥嬬己鐐光€?/strong>鈥嬶紙琛€娉鍛娾殸锔忥級锛?/p>
- 姣忔璋冪敤閮戒細閲嶆柊瑙f瀽绫诲瀷淇℃伅
- 瀹炴祴鏁版嵁锛氬惊鐜?涓囨鑰楁椂380ms锛堢洿鎺ew鍙0.3ms锛?/li>
鈥?strong>鈥嬮€傜敤鍦烘櫙鈥?/strong>鈥嬶細閰嶇疆鏂囦欢鍔犺浇銆佸崟娆″垵濮嬪寲鎿嶄綔
鏂规硶浜岋細杩涢樁鐗堚€斺€擟onstructorInfo缂撳瓨
锛堣€佸徃鏈哄繀澶囩殑鐪佹补鎶€宸э級
csharp澶嶅埗// 鎻愬墠缂撳瓨鏋勯€犲嚱鏁?/span> private static readonly ConstructorInfo _studentCtor = typeof(Student).GetConstructor(new[] { typeof(string) }); // 浣跨敤鏃剁洿鎺ラ杞?/span> object obj = _studentCtor.Invoke(new object[] { "鑰佺帇" });
鈥?strong>鈥嬩紭鍖栨晥鏋溾€?/strong>鈥嬶細
- 1涓囨璋冪敤浠?80ms闄嶅埌85ms
- 鍐呭瓨鍗犵敤鍑忓皯60%
鈥?strong>鈥嬫敞鎰忕粏鑺傗€?/strong>鈥嬶細
- 鐢?code>static readonly闃叉閲嶅鍒濆鍖?/li>
- 澶嶆潅鍙傛暟绫诲瀷寤鸿棰勫厛鐢熸垚Type鏁扮粍
鏂规硶涓夛細缁堟瀬鐗堚€斺€旇〃杈惧紡鏍戠紪璇?/h3>
锛堟€ц兘鐩撮€肩洿鎺ew鐨勯獨鎿嶄綔锛?/p>
csharp澶嶅埗// 缂栬瘧鎴愬鎵樺悗閫熷害璧烽 var param = Expression.Parameter(typeof(string)); var newExpr = Expression.New(typeof(Student).GetConstructor(new[] { typeof(string) }), param); var lambda = Expression.Lambda
string, Student>>(newExpr, param); Func<string, Student> creator = lambda.Compile(); // 浣跨敤鏃朵唬鐮佹竻鐖藉埌鍝?/span> Student stu = creator("鑰佸紶");
鈥?strong>鈥嬫€ц兘鏍哥垎绾ф彁鍗団€?/strong>鈥嬶細
- 1涓囨璋冪敤浠呴渶1.2ms
- 姣旂洿鎺ew鎱笉鍒?鍊?/li>
鐏甸瓊鎷烽棶锛氫笁绉嶆柟娉曟€庝箞閫夛紵
锛堟嬁椤圭洰缁忓巻涓句釜鏍楀瓙馃尠锛?/p>
鍘诲勾鍋氱數鍟嗕績閿€绯荤粺锛岃鍔ㄦ€佸垱寤?00绉嶄紭鎯犲埜銆傝瘯杩囦笁绉嶆柟妗堬細
- Activator鐗?鈫?娲诲姩寮€濮嬬灛闂碈PU椋欏埌90%
- 鏋勯€犲嚱鏁扮紦瀛?鈫?CPU缁存寔鍦?0%锛屼絾寤惰繜鏄庢樉
- 琛ㄨ揪寮忔爲鐗?鈫?CPU 45%锛屾祦鐣呭寰疯姍
鈥?strong>鈥嬬粨璁衡€?/strong>鈥嬶細
- 浣庨鍦烘櫙鐢ㄦ柟娉曚竴
- 涓珮棰戠敤鏂规硶浜?/li>
- 鎬ц兘鏁忔劅鍨嬬敤鏂规硶涓?/li>
閬垮潙鎸囧崡锛氫簲涓鍛界殑缁嗚妭
-
鈥?strong>鈥嬬被鍨嬪畨鍏ㄦ娴嬧€?/strong>鈥嬶細
csharp澶嶅埗
// 杞瀷鍓嶅繀椤诲仛绫诲瀷妫€鏌?/span> if(obj is Student s) s.Run();
鍘诲勾娌″仛妫€鏌ワ紝绾夸笂鎶ラ敊"鏃犳硶灏咥pple杞垚iPhone"锛岃浜у搧缁忕悊杩芥潃涓夋潯琛?/p>
-
鈥?strong>鈥嬭法绋嬪簭闆嗗姞杞解€?/strong>鈥嬶細
csharp澶嶅埗
// 鍔犺浇绗笁鏂笵LL鐨勬纭Э鍔?/span> Assembly asm = Assembly.LoadFrom(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins.dll"));
鐩存帴鍐欑粷瀵硅矾寰勭殑閮借寮€闄や簡
-
鈥?strong>鈥嬬鏈夋瀯閫犲嚱鏁扮牬瑙b€?/strong>鈥嬶細
csharp澶嶅埗
var ctor = type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null);
鍗曚緥妯″紡涔熸尅涓嶄綇鍙嶅皠锛屼絾灏忓績琚灦鏋勫笀鎷夐粦
灏忕紪瑙傜偣锛堣鐐瑰悓琛屼笉鏁㈣鐨勶級
瑙佽繃鏈変汉涓轰簡鐐妧锛岃繛鍒涘缓宸茬煡绫诲瀷閮界敤鍙嶅皠鈥斺€旇繖灏卞ソ姣旂敤瀵煎脊鎵撹殜瀛愩€傗€?strong>鈥嬪弽灏勭湡姝g殑浠峰€煎湪鍔ㄦ€佸満鏅€?/strong>鈥嬶紝姣斿锛?/p>
- 鎻掍欢绯荤粺鍔犺浇鏈煡绫诲瀷
- ORM妗嗘灦鏄犲皠鏁版嵁搴撳瓧娈?/li>
- 娓告垙寮曟搸鐨勭儹鏇存柊妯″潡
鍘诲勾閲嶆瀯鏃ュ織绯荤粺锛岀敤琛ㄨ揪寮忔爲+缂撳瓨鎶婂弽灏勬€ц兘鎻愬崌浜?00鍊嶃€傝浣忥細鈥?strong>鈥嬮珮鎵嬩笉鏄笉鐢ㄥ弽灏勶紝鑰屾槸鐭ラ亾浠€涔堟椂鍊欒韪╁埞杞︹€?/strong>鈥嬨€備笅娆¤皝鍐嶈鍙嶅皠鎱紝鎶婅繖绡囨枃绔犵敥浠栬劯涓婏紒