newStudent()涓嶉鍚楋紵鎼炲弽灏勪笉鏄劚瑁ゅ瓙鏀惧眮锛?鈥斺€旇繖鏄笉鏄綘鐜板湪鐨勫績澹帮紵锛堝搸鍒€ワ紒锛夋兂璞¤繖涓満鏅細浣犺寮€鍙戜竴涓€?strong>鈥嬫彃浠剁郴缁熲€?/strong>鈥嬶紝鏍规湰涓嶇煡閬撶敤鎴蜂細濉炵粰浣犱粈涔堢被銆傝" />
  1. 主页 > 好文章

C#反射动态实例化对象教程:从入门到实践


馃殌 涓€銆佺伒榄傛嫹闂細涓嶇敤new鎬庝箞閫犲璞★紵

"鎴戠洿鎺?code>new Student()涓嶉鍚楋紵鎼炲弽灏勪笉鏄劚瑁ゅ瓙鏀惧眮锛?鈥斺€旇繖鏄笉鏄綘鐜板湪鐨勫績澹帮紵

锛堝搸鍒€ワ紒锛夋兂璞¤繖涓満鏅細浣犺寮€鍙戜竴涓€?strong>鈥嬫彃浠剁郴缁熲€?/strong>鈥嬶紝鏍规湰涓嶇煡閬撶敤鎴蜂細濉炵粰浣犱粈涔堢被銆傝繖鏃跺€欏弽灏勫氨鍍忋€婂搱鍒╂尝鐗广€嬮噷鐨勫彉褰㈡湳锛岃兘鍑┖鍙樺嚭鏈煡鐨勫璞★紒鉁?/p>

涓句釜鐪熷疄妗堜緥锛氭煇娓告垙妗嗘灦鐢ㄥ弽灏勫姩鎬佸姞杞組OD锛岃鐜╁鑷埗瑙掕壊鎶€鑳姐€傗€?strong>鈥嬫病鏈夊弽灏勶紝杩欑鐏垫椿鎵╁睍鏍规湰鐜╀笉杞€?/strong>鈥嬶紒


馃洜锔?浜屻€佸姩鎬佸疄渚嬪寲鐨勪笁澶ф牳蹇冩楠?/h3>

馃攳 姝ラ1锛氭壘鍒?韬唤璇?鈥斺€旇幏鍙朤ype瀵硅薄

csharp澶嶅埗
// 鏈€甯哥敤濮垮娍锛堟敞鎰忓叏鍚嶈甯﹀懡鍚嶇┖闂达紒锛?/span>
Type heroType = Type.GetType("GameModule.Player.Hero");

鈥?strong>鈥嬮噸鐐归伩鍧戞寚鍗椻€?/strong>鈥嬶細

  1. 绫诲悕鎷奸敊鐩存帴杩斿洖null 鈫?寤鸿鐢╪ameof(Hero)鐢熸垚
  2. 璺ㄧ▼搴忛泦锛熷厛鍔犺浇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>
鐩存帴new15ms0.1MB鉂?/td>
鍙嶅皠鍒涘缓3200ms3.2MB鉁?/td>
缂撳瓨Type浼樺寲800ms1.5MB鉁?/td>

鈥?strong>鈥嬭娉暀璁€?/strong>鈥嬶細

  • 鍦ㄥ惊鐜噷鏃犺剳鐢ㄥ弽灏?鈫?鐩存帴GG
  • 浼樺寲鏂规锛氭彁鍓嶇紦瀛楾ype鍜孋onstructorInfo

馃挕 浜斻€佺嫭瀹堕伩鍧戠绫嶏紙鍏ㄧ綉棣栧彂锛?/h3>
  1. 鈥?strong>鈥嬬増鏈吋瀹规€х偢寮桂煉b€?/strong>鈥嬶細
    鏌愭鏇存柊鎶?code>UserManager閲嶅懡鍚嶄负AccountManager锛屽弽灏勪唬鐮佺洿鎺ョ垎鐐搞€傗€?strong>鈥嬭В鍐虫柟妗堚€?/strong>鈥嬶細鐢ㄦ帴鍙g害鏉熷弽灏勭被锛?/p>

    csharp澶嶅埗
    var service = Activator.CreateInstance(type) as IBaseService;
  2. 鈥?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));
    }
  3. 鈥?strong>鈥嬪崟鍏冩祴璇曟姢浣撶馃敀鈥?/strong>鈥嬶細
    缁欏弽灏勪唬鐮佸啓娴嬭瘯鐢ㄤ緥锛屾瘮Debug鏃跺摥鐖瑰枈濞樺己100鍊嶏紒


馃寛 鍏€佷粈涔堟椂鍊欒/涓嶈鐢ㄥ弽灏勶紵

鉁?蹇呯敤鍦烘櫙锛?/p>

  • 寮€鍙戞彃浠剁郴缁?/li>
  • 瀹炵幇IoC瀹瑰櫒锛堟瘮濡侫utofac锛?/li>
  • 缂栧啓ORM妗嗘灦

馃毇 浣滄鍦烘櫙锛?/p>

  • 鍗曠函鍒涘缓宸茬煡绫诲瀷瀵硅薄
  • 瀵规€ц兘瑕佹眰鏋侀珮鐨勬ā鍧?/li>
  • 鏇夸唬绠€鍗曞伐鍘傛ā寮?/li>

鈥?strong>鈥嬬嫭瀹惰瑙b€?/strong>鈥嬶細
鍘诲勾鐢ㄥ弽灏勫疄鐜板姩鎬佹姤琛ㄧ敓鎴愬櫒锛屽紑鍙戞晥鐜囨彁鍗?0%锛佷絾涓婄嚎鍚嶤PU椋欏埌90%...鍚庢潵鏀圭敤Emit锛堜腑闂寸爜鐢熸垚锛夋墠瑙e喅銆傗€?strong>鈥嬪弽灏勬槸寮€缃愬櫒锛屼笉鑳藉綋鑿滃垁鐢ㄢ€?/strong>鈥嬶紒

本文由嘻道妙招独家原创,未经允许,严禁转载