C#反射动态实例化对象教程:从入门到实践
馃殌 涓€銆佺伒榄傛嫹闂細涓嶇敤new鎬庝箞閫犲璞★紵
"鎴戠洿鎺?code>new Student()涓嶉鍚楋紵鎼炲弽灏勪笉鏄劚瑁ゅ瓙鏀惧眮锛?鈥斺€旇繖鏄笉鏄綘鐜板湪鐨勫績澹帮紵
锛堝搸鍒€ワ紒锛夋兂璞¤繖涓満鏅細浣犺寮€鍙戜竴涓€?strong>鈥嬫彃浠剁郴缁熲€?/strong>鈥嬶紝鏍规湰涓嶇煡閬撶敤鎴蜂細濉炵粰浣犱粈涔堢被銆傝繖鏃跺€欏弽灏勫氨鍍忋€婂搱鍒╂尝鐗广€嬮噷鐨勫彉褰㈡湳锛岃兘鍑┖鍙樺嚭鏈煡鐨勫璞★紒鉁?/p>
涓句釜鐪熷疄妗堜緥锛氭煇娓告垙妗嗘灦鐢ㄥ弽灏勫姩鎬佸姞杞組OD锛岃鐜╁鑷埗瑙掕壊鎶€鑳姐€傗€?strong>鈥嬫病鏈夊弽灏勶紝杩欑鐏垫椿鎵╁睍鏍规湰鐜╀笉杞€?/strong>鈥嬶紒
馃洜锔?浜屻€佸姩鎬佸疄渚嬪寲鐨勪笁澶ф牳蹇冩楠?/h3>
馃攳 姝ラ1锛氭壘鍒?韬唤璇?鈥斺€旇幏鍙朤ype瀵硅薄
csharp澶嶅埗// 鏈€甯哥敤濮垮娍锛堟敞鎰忓叏鍚嶈甯﹀懡鍚嶇┖闂达紒锛?/span>
Type heroType = Type.GetType("GameModule.Player.Hero");
// 鏈€甯哥敤濮垮娍锛堟敞鎰忓叏鍚嶈甯﹀懡鍚嶇┖闂达紒锛?/span>
Type heroType = Type.GetType("GameModule.Player.Hero");
鈥?strong>鈥嬮噸鐐归伩鍧戞寚鍗椻€?/strong>鈥嬶細
- 绫诲悕鎷奸敊鐩存帴杩斿洖null 鈫?寤鸿鐢╪ameof(Hero)鐢熸垚
- 璺ㄧ▼搴忛泦锛熷厛鍔犺浇DLL锛?/li>
csharp澶嶅埗Assembly assembly = Assembly.LoadFrom("ThirdParty.dll"); Type npcType = assembly.GetType("ThirdParty.NPC");
馃幆 姝ラ2锛氶€夊"鏂藉伐鍥剧焊"鈥斺€旇幏鍙栨瀯閫犲嚱鏁?/h4>
锛堣繖閲屾渶瀹规槗缈昏溅锛侊級
csharp澶嶅埗// 鑾峰彇甯nt鍜宻tring鍙傛暟鐨勬瀯閫犲櫒 ConstructorInfo ctor = heroType.GetConstructor(new[] { typeof(int), typeof(string) }); // 濡傛灉鏋勯€犲櫒鏄鏈夌殑锛熷姞杩欎釜flag锛?/span> ConstructorInfo privateCtor = heroType.GetConstructor( BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[0], null);
馃鈾傦笍 姝ラ3锛氬紑濮?榄旀硶鍙敜"鈥斺€擨nvoke澶ф硶
csharp澶嶅埗object heroObj = ctor.Invoke(new object[] { 100, "浜氱储" }); // 瀹夊叏杞瀷濂楄矾锛堜袱绉嶅Э鍔夸换閫夛級 if(heroObj is Hero realHero) { ... } // 鎴栬€? var safeHero = heroObj as Hero; safeHero?.UltimateSkill();
馃敟 涓夈€佸疄鎴橈細鐢ㄥ弽灏勫疄鐜版妧鑳界郴缁?/h3>
鍋囪鎴戜滑瑕佸姩鎬佸姞杞戒笉鍚岃亴涓氱殑鎶€鑳斤細
csharp澶嶅埗// 閰嶇疆鏂囦欢涓畾涔?/span> string config = "Warrior, 鏃嬮鏂? Mage, 鏆撮闆?; // 鍔ㄦ€佸垱寤烘妧鑳藉疄渚?/span> foreach(var skillInfo in config.Split(';')) { string[] parts = skillInfo.Trim().Split(','); string className = $"Game.Skills.{parts[0]}Skill"; Type skillType = Type.GetType(className); object skill = Activator.CreateInstance(skillType); MethodInfo castMethod = skillType.GetMethod("Cast"); castMethod.Invoke(skill, new object[] { parts[1].Trim() }); }
鈥?strong>鈥嬫暡榛戞澘鈥?/strong>鈥嬶細
Activator.CreateInstance
鏄揩閫熷垱寤烘棤鍙傚璞$殑鎹峰緞- 浣嗗甫鍙傛暟鏃惰繕鏄€佸疄鐢–onstructorInfo鏇寸ǔ
馃啔 鍥涖€佹櫘閫歏S鍙嶅皠锛氭€ц兘瀵规瘮瀹炴祴
锛堟嬁鐪熷疄鏁版嵁璇磋瘽锛?/p>
鏂瑰紡 | 10涓囨璋冪敤鑰楁椂 | 鍐呭瓨鍗犵敤 | 浠g爜鐏垫椿鎬?/th> |
---|---|---|---|
鐩存帴new | 15ms | 0.1MB | 鉂?/td> |
鍙嶅皠鍒涘缓 | 3200ms | 3.2MB | 鉁?/td> |
缂撳瓨Type浼樺寲 | 800ms | 1.5MB | 鉁?/td> |
鈥?strong>鈥嬭娉暀璁€?/strong>鈥嬶細
- 鍦ㄥ惊鐜噷鏃犺剳鐢ㄥ弽灏?鈫?鐩存帴GG
- 浼樺寲鏂规锛氭彁鍓嶇紦瀛楾ype鍜孋onstructorInfo
馃挕 浜斻€佺嫭瀹堕伩鍧戠绫嶏紙鍏ㄧ綉棣栧彂锛?/h3>
-
鈥?strong>鈥嬬増鏈吋瀹规€х偢寮桂煉b€?/strong>鈥嬶細
鏌愭鏇存柊鎶?code>UserManager閲嶅懡鍚嶄负AccountManager
锛屽弽灏勪唬鐮佺洿鎺ョ垎鐐搞€傗€?strong>鈥嬭В鍐虫柟妗堚€?/strong>鈥嬶細鐢ㄦ帴鍙g害鏉熷弽灏勭被锛?/p>
csharp澶嶅埗var service = Activator.CreateInstance(type) as IBaseService;
-
鈥?strong>鈥嬫€ц兘鏁戞槦猸愨€?/strong>鈥嬶細
娣峰悎浣跨敤娉涘瀷+鍙嶅皠锛?/p>
csharp澶嶅埗public T Create<T>() where T : new()
{
// 甯歌绫诲瀷鐩存帴new
if(typeof(T) == typeof(KnownType)) return new T();
// 鐗规畩绫诲瀷璧板弽灏?/span>
return (T)ReflectionHelper.Create(typeof(T));
}
-
鈥?strong>鈥嬪崟鍏冩祴璇曟姢浣撶馃敀鈥?/strong>鈥嬶細
缁欏弽灏勪唬鐮佸啓娴嬭瘯鐢ㄤ緥锛屾瘮Debug鏃跺摥鐖瑰枈濞樺己100鍊嶏紒
馃寛 鍏€佷粈涔堟椂鍊欒/涓嶈鐢ㄥ弽灏勶紵
鈥?strong>鈥嬬増鏈吋瀹规€х偢寮桂煉b€?/strong>鈥嬶細
鏌愭鏇存柊鎶?code>UserManager閲嶅懡鍚嶄负AccountManager
锛屽弽灏勪唬鐮佺洿鎺ョ垎鐐搞€傗€?strong>鈥嬭В鍐虫柟妗堚€?/strong>鈥嬶細鐢ㄦ帴鍙g害鏉熷弽灏勭被锛?/p>
csharp澶嶅埗var service = Activator.CreateInstance(type) as IBaseService;
鈥?strong>鈥嬫€ц兘鏁戞槦猸愨€?/strong>鈥嬶細
娣峰悎浣跨敤娉涘瀷+鍙嶅皠锛?/p>
csharp澶嶅埗public T Create<T>() where T : new() { // 甯歌绫诲瀷鐩存帴new if(typeof(T) == typeof(KnownType)) return new T(); // 鐗规畩绫诲瀷璧板弽灏?/span> return (T)ReflectionHelper.Create(typeof(T)); }
鈥?strong>鈥嬪崟鍏冩祴璇曟姢浣撶馃敀鈥?/strong>鈥嬶細
缁欏弽灏勪唬鐮佸啓娴嬭瘯鐢ㄤ緥锛屾瘮Debug鏃跺摥鐖瑰枈濞樺己100鍊嶏紒
鉁?蹇呯敤鍦烘櫙锛?/p>
- 寮€鍙戞彃浠剁郴缁?/li>
- 瀹炵幇IoC瀹瑰櫒锛堟瘮濡侫utofac锛?/li>
- 缂栧啓ORM妗嗘灦
馃毇 浣滄鍦烘櫙锛?/p>
- 鍗曠函鍒涘缓宸茬煡绫诲瀷瀵硅薄
- 瀵规€ц兘瑕佹眰鏋侀珮鐨勬ā鍧?/li>
- 鏇夸唬绠€鍗曞伐鍘傛ā寮?/li>
鈥?strong>鈥嬬嫭瀹惰瑙b€?/strong>鈥嬶細
鍘诲勾鐢ㄥ弽灏勫疄鐜板姩鎬佹姤琛ㄧ敓鎴愬櫒锛屽紑鍙戞晥鐜囨彁鍗?0%锛佷絾涓婄嚎鍚嶤PU椋欏埌90%...鍚庢潵鏀圭敤Emit锛堜腑闂寸爜鐢熸垚锛夋墠瑙e喅銆傗€?strong>鈥嬪弽灏勬槸寮€缃愬櫒锛屼笉鑳藉綋鑿滃垁鐢ㄢ€?/strong>鈥嬶紒
本文由嘻道妙招独家原创,未经允许,严禁转载