Heim  >  Artikel  >  Backend-Entwicklung  >  C# verwendet Reflektion, um ein Instanzobjekt einer Klasse basierend auf dem Klassennamen zu erstellen.

C# verwendet Reflektion, um ein Instanzobjekt einer Klasse basierend auf dem Klassennamen zu erstellen.

黄舟
黄舟Original
2017-03-16 10:57:502768Durchsuche

In diesem Artikel wird hauptsächlich die detaillierte Erläuterung der Verwendung von C# zum Erstellen einer Instanz eines Klassen-Objekts basierend auf dem Klassennamen vorgestellt. „Reflection“ verwendet tatsächlich die Metadateninformationen von Wenn Sie interessiert sind, können Sie darauf verweisen.

„Reflection“ verwendet tatsächlich die Metadateninformationen der Assembly. Reflection kann viele Methoden haben. Wenn Sie ein Programm schreiben, importieren Sie bitte zuerst den System.Reflection -Namespace .

1. Angenommen, Sie möchten eine Klasse in DLL widerspiegeln, und es gibt keinen Referenz darauf (d. h. einen unbekannten Typ):


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

2. Wenn Sie die Klasse im aktuellen Projekt widerspiegeln möchten (d. h. das aktuelle Projekt hat darauf verwiesen). ), können Sie Folgendes tun:


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

3. Es kann auch sein:


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

4. Wenn es sich um unterschiedliche Assemblys handelt, müssen sie geladen und aufgerufen werden. Der Code lautet wie folgt:

System.Reflection.Assembly .Load("Assembly-Name (ohne Dateisuffix)").CreateInstance(" Namespace.Class-Name", false);

Zum Beispiel:

Der Code ist wie folgt:

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

Hinweis: Aufgrund der Verwendung von Dynamic müssen Sie das Ziel auf 4.0 ändern Der dynamische -Ausdruck kann während der Kompilierung nicht gefunden werden. Der Fehler „Ob fehlende Referenz“ liegt daran, dass eine Referenz fehlt. Verweisen Sie auf die Miscorsoft.CSharp-Klassenbibliothek im Projekt, und das wird der Fall sein nach dem Hinzufügen erfolgreich kompiliert.

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

Ergänzung:

1) Beim Erstellen einer Instanz einer Klasse durch Reflexion , müssen Sie sicherstellen, dass Sie den vollständig qualifizierten Namen (Namespace + Klassenname) verwenden. Wenn die Type.GetType-Methode null zurückgibt, bedeutet dies, dass die -Suche nach relevanten Informationen in den -Metadaten fehlgeschlagen ist (Reflektion fehlgeschlagen). Bitte stellen Sie sicher, dass Sie den vollständig qualifizierten Namen der Klasse verwenden während der Reflexion.

2) Die Reflexionsfunktion ist sehr leistungsstark und es gibt nichts, was nicht erreicht werden kann. Wenn Sie „Cross-Assembly“ implementieren möchten, verwenden Sie bitte die erste Methode, um eine Instanz der Klasse zu erstellen und die Felder, Eigenschaften, Methoden, Ereignisse... der Klasse widerzuspiegeln Instanz und rufen Sie sie dann dynamisch auf.


  /// <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);
      }
    }
  }

Das obige ist der detaillierte Inhalt vonC# verwendet Reflektion, um ein Instanzobjekt einer Klasse basierend auf dem Klassennamen zu erstellen.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn