C# Reflectie en gebruik van custom attributes

Pagina: 1
Acties:
  • 285 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • newpegasus
  • Registratie: Juni 2003
  • Laatst online: 13-03-2022
Hallo,

Ik ben bezig een applicatie te schrijven die aan de hand van een assembly (een dll) een GUI genereerd. In deze assembly wordt gebruik gemaakt van Custom Attributes. Deze zijn als volgt gedeclareerd:

C#:
1
2
3
4
5
6
7
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class BewegingAttribute : System.Attribute {
    public string Text;
    public BewegingAttribute(String Text){
        this.Text = Text;
    }
}


Dit wordt als volgt toegepast in de assembly:

C#:
1
2
3
4
5
6
7
8
public class Badminton
{
    [Beweging("center")]
    public String getCenter()
    {
       // doe iets leuks
    }
}


In de klasse waar ik reflecteer wil ik dus nagaan of een methode het attribuut "Beweging" heeft. Dit doe ik als volgt:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    private static void Reflect()
    {
        Assembly assembly = Assembly.LoadFile(Directory.GetCurrentDirectory() + "\\" + "ConsoleApplication2.dll");

        foreach (Type theType in assembly.GetTypes())
        {
            if (theType.Name != "Badminton")
                continue;
            Console.WriteLine(theType.Name);
            foreach (MethodInfo theMethod in theType.GetMethods())
            {
                if (theMethod.IsDefined(typeof(BewegingAttribute), true))
                    Console.WriteLine(theMethod.Name);
            }
        }
    }


Zo staat het ook in de meeste voorbeelden beschreven. Gek genoeg wordt de naam van de methode, in dit geval "getCenter", nooit afgedrukt. Wanneer ik doormiddel van de methode GetCustomAttributes() het aantal attributen opvraag, komt ie terug met 1. (goed dus). Ook wanneer ik de naam van het attribuut opvraag komt ie met Beweging terug, ook goed dus. Maar waarom herkent C# deze methode niet als zijnde van het type "Beweging"?

Ik ben er al een tijd mee bezig, maar kom niet verder....misschien is het een kleinigheid maar ik zie deze niet op dit moment. Iemand met meer inzicht nog wakker?

//edit: kleine toevoeging

C#:
1
2
3
                foreach (object test in theMethod.GetCustomAttributes(true)){
                    BewegingAttribute bla = (BewegingAttribute)test;
                }


Wanneer ik bovenstaande probeer krijg ik de melding: "Kan een object van het type BewegingAttribute niet converteren naar het type BewegingAttribute." (Visual Studio 2005 overigens). Dit is vreemd, op een of andere manier worden er verschillende typen BewegingAttribute 's onderscheden?

[ Voor 11% gewijzigd door newpegasus op 11-01-2008 23:43 ]

GuitarFacts | Last.fm | Google Zoekmachine Optimalisatie


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:57
Je moet de IsDefined method gebruiken van de Attribute class:
code:
1
2
3
4
5
6
7
foreach( MethodInfo mi in methods )
{
    if( Attribute.IsDefined (mi, typeof (MyAttribute)) )
    {
          Console.WriteLine (mi.Name + " implements MyAttribute");
    }
}

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • newpegasus
  • Registratie: Juni 2003
  • Laatst online: 13-03-2022
Helaas, ik heb bovenstaande geprobeerd, maar dit mag niet baten. Kan het misschien iets te maken hebben met hetgeen wat ik in mijn edit heb staan?

//edit

Ik denk dat ik de fout heb ontdekt, ik weet alleen niet hoe deze op te lossen. De klasse BewegingAttribute bevindt zich in de assembly, maar hoe kan ik in de klasse waarin ik reflecteer checken of een methode dit attribuut heeft? De compiler kent de klasse BewegingAttribute immers nog niet.....? Iemand een idee?

[ Voor 52% gewijzigd door newpegasus op 11-01-2008 23:55 ]

GuitarFacts | Last.fm | Google Zoekmachine Optimalisatie


Acties:
  • 0 Henk 'm!

  • newpegasus
  • Registratie: Juni 2003
  • Laatst online: 13-03-2022
Ok, ik heb het gevonden. Heel stom, maar ik hoop dat iemand er in de toekomst nog wat aan heeft:

Zet de klasse waar je je attributes declareerd in een apart project, en zet references naar dat project waar je dat nodig hebt. Zo kan er geen verwarring ontstaan naar welke klasse gerefereerd wordt.

GuitarFacts | Last.fm | Google Zoekmachine Optimalisatie


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:57
newpegasus schreef op vrijdag 11 januari 2008 @ 23:46:
Helaas, ik heb bovenstaande geprobeerd, maar dit mag niet baten. Kan het misschien iets te maken hebben met hetgeen wat ik in mijn edit heb staan?
Net uitgetest, en it works as a charm...

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Blizard
  • Registratie: September 2001
  • Niet online
Ik vraag me af of dit wel het mooiste design is voor jou programma ? Kan je via een paar design changes niet rond de reflection werken ?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:57
als je wil weten of een bepaalde method een bepaald attribute heeft, dan kan je niet om reflection heen.

Of attributes nodig zijn voor het programma dat TS aan het maken is, dat is nu moeilijk te zeggen .

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • newpegasus
  • Registratie: Juni 2003
  • Laatst online: 13-03-2022
Het mooiste design; nee dat is het niet. Maar het is onderdeel van een verplichte opdracht voor mijn opleiding.

GuitarFacts | Last.fm | Google Zoekmachine Optimalisatie


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:57
En daarom mag het design brak zijn ?
(Ik zeg niet dat het dat is, want daar kan ik niet over oordelen aangezien ik de opdracht niet ken, en ook jouw design niet ken, maar uit jouw laatste reply blijkt dat wel ... )

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • newpegasus
  • Registratie: Juni 2003
  • Laatst online: 13-03-2022
Ok, misschien niet helemaal goed geformuleerd, maar het design op zich zit best aardig in elkaar. Alleen vind ik in dit programma nogal overkill om het op deze manier aan te pakken. Ik had best een zelfde applicatie kunnen bouwen waar het gebruik van reflectie niet nodig was, maar functioneel hetzelfde doet.

GuitarFacts | Last.fm | Google Zoekmachine Optimalisatie

Pagina: 1