天天看點

C#——反射動态建立類的執行個體

“反射”其實就是利用程式集的中繼資料資訊。 反射可以有很多方法,編寫程式時請先導入 System.Reflection 命名空間。

若要反射目前項目中的類(即目前項目已經引用它了),可以使用下面的寫法。這種情況是我們項目中經常遇到的,主要作用就是解耦,便于項目後期拓展。

首先在配置檔案中添加appsetting節點:

<appSettings>
  <add key="AssemblyPath" value="ConsoleApp11"/>
  <add key="NameSpace" value="ConsoleApp11"/>
  <add key="ClassName" value="Student"/>
</appSettings>      

核心代碼:

private static readonly string assemblyName = ConfigurationManager.AppSettings["AssemblyPath"];//程式集
private static readonly string nameSpace = ConfigurationManager.AppSettings["NameSpace"];//命名空間
private static readonly string className = ConfigurationManager.AppSettings["ClassName"];//類名

public static object CreateInstance(string assemblyName, string nameSpace, string className)
{
    try
    {
        string fullName = nameSpace + "." + className;//命名空間.類型名
        object ect = Assembly.Load(assemblyName).CreateInstance(fullName);//加載程式集,建立程式集裡面的 命名空間.類型名 執行個體
        return ect;//類型轉換并傳回    
    }
    catch (Exception ex) { Console.WriteLine(ex.Message + "===" + ex.StackTrace); return false; }
}      

控制台調用:

static void Main(string[] args)
{
    IPerson ip = CreateInstance(assemblyName, nameSpace, className) as IPerson;
    ip.Say();
    Console.ReadKey();
}      

其中Student類是繼承于接口IPerson,擁有Say()的方法:

public interface IPerson { void Say(); }
public class Student : IPerson { public void Say() { Console.WriteLine("我是學生...."); } }      

注釋:利用接口和反射的方法某種程度達到了解耦的效果。假如有許多類:Teacher、Child等都繼承于IPerson接口,此次項目結束時可能我們隻需要Student類,不需要實作其他類的方法。但是一旦下次做更改的時候,就可以通過配置檔案進行更改,快捷友善。

 參考:C# 利用反射根據類名建立類的執行個體對象

轉載于:https://www.cnblogs.com/wuqiuxue/p/7699856.html

c#