首頁 >後端開發 >C#.Net教程 >C#利用反射根據類別名稱創建類別的實例物件的詳細介紹

C#利用反射根據類別名稱創建類別的實例物件的詳細介紹

黄舟
黄舟原創
2017-03-16 10:57:502805瀏覽

這篇文章主要介紹了詳解C# 利用反射根據類別名稱創建類別的實例物件,「反射」其實就是利用組件的元資料訊息,感興趣的小夥伴們可以參考一下。

「反射」其實就是利用組件的元資料資訊。 反射可以有很多方法,寫程式時請先匯入 System.Reflection 命名空間

1、假設你要反射一個DLL 中的類,並且沒有引用它(即未知的類型):


Assembly assembly = Assembly.LoadFile("程序集路径,不能是相对路径"); // 加载程序集(EXE 或 DLL) 
dynamic obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)"); // 创建类的实例

2、若要反射目前專案中的類別(即目前專案已經引用它了)可以是:


Assembly assembly = Assembly.GetExecutingAssembly(); // 获取当前程序集 
dynamic obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)"); 
// 创建类的实例,返回为 object 类型,需要强制类型转换

3、也可以是:


#
Type type = Type.GetType("类的完全限定名"); 
dynamic obj = type.Assembly.CreateInstance(type);

4、不同組件的話,則要裝載調用,程式碼如下:

System.Reflection.Assembly.Load("組件名稱(不含檔案後綴名)").CreateInstance("命名空間.類別名稱" , false);

如:

程式碼如下:

dynamic o = System.Reflection.Assembly.Load("MyDll").CreateInstance("MyNameSpace.A", false);

注意:由於要用到dynamic ,需要把target 改為4.0 ,如果編譯時出現「找不到編譯動態表達式所需的一個或多個型別。是否缺少引用?」的錯誤,是因為缺少一個引用,在專案裡引用Miscorsoft.CSharp類別函式庫,新增後就能編譯成功。

========================================= ==============

補充:

1)反射建立某個類別的實例時,必須確保使用類別的完全限定名(命名空間+ 類別名稱)。 Type.GetType 方法傳回 null 則意義搜尋元資料中的相關資訊失敗(反射失敗),請確保反射時使用類別的完全限定名。

2)反射功能十分強大,沒有什麼不能實現的。若實作“跨組件”,請使用第一種方法建立類別的實例,並反射該實例的欄位、屬性、方法、事件... 然後動態呼叫之。


  /// <summary>
  /// 反射帮助类
  /// </summary>
  public static class ReflectionHelper
  {
    /// <summary>
    /// 创建对象实例
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="fullName">命名空间.类型名</param>
    /// <param name="assemblyName">程序集</param>
    /// <returns></returns>
    public static T CreateInstance<T>(string fullName, string assemblyName)
    {
      string path = fullName + "," + assemblyName;//命名空间.类型名,程序集
      Type o = Type.GetType(path);//加载类型
      object obj = Activator.CreateInstance(o, true);//根据类型创建实例
      return (T)obj;//类型转换并返回
    }

    /// <summary>
    /// 创建对象实例
    /// </summary>
    /// <typeparam name="T">要创建对象的类型</typeparam>
    /// <param name="assemblyName">类型所在程序集名称</param>
    /// <param name="nameSpace">类型所在命名空间</param>
    /// <param name="className">类型名</param>
    /// <returns></returns>
    public static T CreateInstance<T>(string assemblyName, string nameSpace, string className)
    {
      try
      {
        string fullName = nameSpace + "." + className;//命名空间.类型名
        //此为第一种写法
        object ect = Assembly.Load(assemblyName).CreateInstance(fullName);//加载程序集,创建程序集里面的 命名空间.类型名 实例
        return (T)ect;//类型转换并返回
        //下面是第二种写法
        //string path = fullName + "," + assemblyName;//命名空间.类型名,程序集
        //Type o = Type.GetType(path);//加载类型
        //object obj = Activator.CreateInstance(o, true);//根据类型创建实例
        //return (T)obj;//类型转换并返回
      }
      catch
      {
        //发生异常,返回类型的默认值
        return default(T);
      }
    }
  }

以上是C#利用反射根據類別名稱創建類別的實例物件的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn