2017-07-27 6 views
-1

I Klasse haben, zu kooperieren:Reflexion und Attribute in .Net Kern verweigern

public class Domain 
    { 
     public static Assembly[] GetAssemblies() 
     { 
      var assemblies = new List<Assembly>(); 
      foreach (ProcessModule module in Process.GetCurrentProcess().Modules) 
      { 
       try 
       { 
        var assemblyName = AssemblyLoadContext.GetAssemblyName(module.FileName); 
        var assembly = Assembly.Load(assemblyName); 
        assemblies.Add(assembly); 
       } 
       catch (BadImageFormatException) 
       { 
        // ignore native modules 
       } 
      } 

      return assemblies.ToArray(); 
     } 
    } 

Meine Hauptklasse wie folgt aussieht:

class Program 
{ 
    public static Dictionary<String, Type> animals; 
    static void Main(string[] args) 
    { 
     var assTab = Domain.GetAssemblies(); 
     foreach (var assembly in assTab) 
     { 
      var m = assembly.GetCustomAttribute<Method>(); 
      if (m != null) 
      { 
       animals.Add(m.Name, assembly.GetType()); 
      } 

     } 

Wo Methode ist eine MethodAttribute Klasse. In Animal.dll habe ich Klasse wie Hund, Katze etc. mit Attribut [Method("cat")] und so weiter. Zu meinem Wörterbuch möchte ich diesen Attributnamen als Zeichenfolge hinzufügen und als Typ (dog, Dog) usw. eingeben. Mein Problem ist, dass mein Programm das nicht tut. Nach dem Programm in Variable Tier habe ich 0 Punkte. Was sollte ich ändern, um zu erreichen, was ich will?

Antwort

0

Das Problem ist in dieser Zeile:

var m = assembly.GetCustomAttribute<Method>(); 

Diese Linie wird immer Attribut auf der Baugruppe. Wenn das Attribut nicht auf die Assembly angewendet wird, erhalten Sie null zurück.

Sie müssen zuerst die Typen in der Assembly abrufen und dann jeden Typ überprüfen, ob er das Attribut enthält. Etwas mehr wie das:

foreach(Type type in assembly.GetTypes()) 
{ 
    var attr = assembly.GetCustomAttribute<Method>(); 
    if (attr!=null) 
    { 
     animals.Add(attr.Name, type); 
    } 
} 
+0

aber jetzt sehe ich nicht meine dll. Ich habe das Projekttier als Klassenbibliothek eingestellt und in Main füge ich einen Verweis hinzu. Aber jetzt funktioniert mein von dir festgelegter Code im Unendlichen :( – nju

+0

Kannst du klarstellen, was du meinst, im Unendlichen ausgeführt zu werden? Dh in welcher Zeile wird es stecken bleiben oder wenn es eine Schleife ist, was läuft es? Mein Code hat nur eine einzige foreach In diesem Fall sollte es nicht möglich sein, sich zu verklemmen ... Wenn Sie es nicht schon getan haben, sollten Sie den Debugger verwenden, um herauszufinden, was jetzt falsch läuft, und ich vermute, dass Sie später irgendwo Probleme bekommen und dass die Tatsache, dass du vorher nichts in deinem Wörterbuch hattest, ist, warum du dieses Problem jetzt nur bekommst. – Chris

+0

Wenn ich meinen Code debugge, sehe ich Animal in der Assembly Tabelle. In Animal habe ich die Klasse Dog, die Attribut [Method ('dog)] hat. Aber wenn ich deinen Code hinzufüge und debugge, hat es nichts wie Tier gesehen, nur durch andere Versammlungen iterieren – nju