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:
Dit wordt als volgt toegepast in de assembly:
In de klasse waar ik reflecteer wil ik dus nagaan of een methode het attribuut "Beweging" heeft. Dit doe ik als volgt:
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
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?
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 ]