“反射”其實就是利用程序集的元數據信息。 反射可以有很多方法,編寫程序時請先導入 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類,不需要實現其他類的方法。但是一旦下次做更改的時候,就可以通過配置文件進行更改,快捷方便。