首页 > 趣闻 > 正文内容

高效实现C#反射创建对象的3种方法及优化技巧

趣闻2025-05-28 04:43:14

浣犳槸涓嶆槸鎬诲惉璇村弽灏勫緢鎱紵

锛堟柊鎵嬪繀鐪嬶細浠婂ぉ鎵嬫妸鎵嬫暀浣犵敤鍙嶅皠閫犵伀绠紝杩樹笉鐑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.Lambdastring, Student>>(newExpr, param);
Func<string, Student> creator = lambda.Compile();

// 浣跨敤鏃朵唬鐮佹竻鐖藉埌鍝?/span>
Student stu = creator("鑰佸紶");

鈥?strong>鈥嬫€ц兘鏍哥垎绾ф彁鍗団€?/strong>鈥嬶細

  • 1涓囨璋冪敤浠呴渶1.2ms
  • 姣旂洿鎺ew鎱笉鍒?鍊?/li>

鐏甸瓊鎷烽棶锛氫笁绉嶆柟娉曟€庝箞閫夛紵

锛堟嬁椤圭洰缁忓巻涓句釜鏍楀瓙馃尠锛?/p>

鍘诲勾鍋氱數鍟嗕績閿€绯荤粺锛岃鍔ㄦ€佸垱寤?00绉嶄紭鎯犲埜銆傝瘯杩囦笁绉嶆柟妗堬細

  1. Activator鐗?鈫?娲诲姩寮€濮嬬灛闂碈PU椋欏埌90%
  2. 鏋勯€犲嚱鏁扮紦瀛?鈫?CPU缁存寔鍦?0%锛屼絾寤惰繜鏄庢樉
  3. 琛ㄨ揪寮忔爲鐗?鈫?CPU 45%锛屾祦鐣呭寰疯姍

鈥?strong>鈥嬬粨璁衡€?/strong>鈥嬶細

  • 浣庨鍦烘櫙鐢ㄦ柟娉曚竴
  • 涓珮棰戠敤鏂规硶浜?/li>
  • 鎬ц兘鏁忔劅鍨嬬敤鏂规硶涓?/li>

閬垮潙鎸囧崡锛氫簲涓鍛界殑缁嗚妭

  1. 鈥?strong>鈥嬬被鍨嬪畨鍏ㄦ娴嬧€?/strong>鈥嬶細

    csharp澶嶅埗
    // 杞瀷鍓嶅繀椤诲仛绫诲瀷妫€鏌?/span>
    if(obj is Student s) s.Run();

    鍘诲勾娌″仛妫€鏌ワ紝绾夸笂鎶ラ敊"鏃犳硶灏咥pple杞垚iPhone"锛岃浜у搧缁忕悊杩芥潃涓夋潯琛?/p>

  2. 鈥?strong>鈥嬭法绋嬪簭闆嗗姞杞解€?/strong>鈥嬶細

    csharp澶嶅埗
    // 鍔犺浇绗笁鏂笵LL鐨勬纭Э鍔?/span>
    Assembly asm = Assembly.LoadFrom(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins.dll"));

    鐩存帴鍐欑粷瀵硅矾寰勭殑閮借寮€闄や簡

  3. 鈥?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>鈥嬨€備笅娆¤皝鍐嶈鍙嶅皠鎱紝鎶婅繖绡囨枃绔犵敥浠栬劯涓婏紒

搜索