Reflections: Type-Attribute auslesen von dynamisch geladen Assemblies



  • Hallo Leute,

    ich will Property-Attribute von dynmaisch geladen Type aus Assemblies auslesen.

    Sprich, ich Lade Assembly-Files aus , lade sie "Assembly.LoadFrom(.. )" hole mir die Typen raus "GetTypes", und will dann von den Typen deren Property-Attribute auslesen, was nicht geht.

    Die Typen werden geladen, nur bekomm ich keine Property-Attribute.

    Wenn ich aber die Assembblies statisch in meine Anwendung referenziere, dann kann ich plötzlich die Attribute lesen!?!?

    Woran liegt das?



  • Servus,

    nur das ich dich richtig verstanden habe, du machst doch sowas oder?

    Assembly assembly = Assembly.LoadFrom(@"C:\foo.dll");
    
    Type[] types = assembly.GetTypes();
    
    PropertyInfo[] properties = types[0].GetProperties();
    

    Hast du CustomAttributes (selbsterstellte)? Dann suche direkt danach:

    foreach (PropertyInfo property in properties)
    {
        object[] bla = property.GetCustomAttributes(typeof(DEINAttribute), false);
    }
    

    Das führt zu einem expliziten Suchen nach dem spezifischen Attribute...

    gruß
    Hellsgore



  • Hallo Hellsgore , ja ich mach es genau so wie du beschrieben hast, aber danke hatte noch nen kleinen denkfehler drin 😉

    Aber jetzt ahb ich noch ne frage, folgendes:

    abstract class BarBase
    {
      [FooAttrib]
      public object Foo {get; set;}
    }
    
    class Bar: BarBase
    {
     [FooAttrib]
      public new int Foo {get; set;}
    }
    

    Wie kann ich nun erreichen, das wenn ich die Attribute von Foo in Bar auslese, nur 1 Attribute zurückgegeben wird, also das vom mit new-deklarieten Property? Weil hier werden jetzt momentan beide Properties zurückgeben.

    Sprich wie kann ich via Reflection erkennen ob ein Attribute mit new- Überschrieben wurde??

    grüße und danke



  • Servus,

    indem du dir nur diese Properties über den Type holst:

    deinType.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public)
    

    Stichwort: BindingFlags

    Danach suchst du dann noch nach deinem Attribute, wie gehabt...

    gruß
    Hellsgore


Anmelden zum Antworten