In mijn (WPF) applicatie gebruik ik de Xceed Property Grid control die properties laat zien van een geselecteerd object. De properties kan ik in mijn code een Category geven (alsook naam en description etc).
Ik wil deze Categories graag op een bepaalde manier rangschikken, en dat kan met een CategoryOrder attribute voor elke category, op de class geplaatst:
Nu heb ik niet alleen maar een 'SomeObject' class, maar heb ik een hele waslijst van misschien wel 20 classes die allemaal in de property grid getoond kunnen worden. Het type properties is echter vaak vergelijkbaar en de Categories dus ook.
Dat betekend dus dat ik op elke class een hele waslijst met CategoryOrder attributes moet plaatsen. En als ik er ooit een toevoeg, of de volgorde wil veranderen, moet ik dat ook op elke class apart gaan doen (om het netjes consequent te houden).
Ik vroeg me af of dit niet makkelijker kan, door bijvoorbeeld een custom attribute te maken die 'dynamisch' een lijst van CategoryOrder attributes toevoegt. Dan hoef ik op elke class alleen maar die ene custom attribute te gebruiken, en kan ik de volgorde op een plek aanpassen.
Ik kom er echter niet achter of dit uberhaupt mogelijk is. Kan een attribute andere attributes "injecteren"? Waarschijnlijk zal dit niet tijdens runtime maar tijdens design time moeten gebeuren... Dus moet ik dan iets als PostSharp gebruiken wat tijdens design-time extra code kan genereren?
Heeft iemand hier ervaring mee?
C#:
1
2
3
4
5
6
7
8
9
10
11
| public class SomeObject { [Category("General")] public string Name {get;set;} [Category("Font")] public string FontName {get;set;} [Category("Font")] public int FontSize {get;set;} } |
Ik wil deze Categories graag op een bepaalde manier rangschikken, en dat kan met een CategoryOrder attribute voor elke category, op de class geplaatst:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
| [CategoryOrder("General", 1)] [CategoryOrder("Font", 2)] public class SomeObject { [Category("General")] public string Name {get;set;} [Category("Font")] public string FontName {get;set;} [Category("Font")] public int FontSize {get;set;} } |
Nu heb ik niet alleen maar een 'SomeObject' class, maar heb ik een hele waslijst van misschien wel 20 classes die allemaal in de property grid getoond kunnen worden. Het type properties is echter vaak vergelijkbaar en de Categories dus ook.
Dat betekend dus dat ik op elke class een hele waslijst met CategoryOrder attributes moet plaatsen. En als ik er ooit een toevoeg, of de volgorde wil veranderen, moet ik dat ook op elke class apart gaan doen (om het netjes consequent te houden).
C#:
1
2
3
4
5
6
7
| [CategoryOrder("General", 1)] [CategoryOrder("Font", 2)] [CategoryOrder("Size", 3)] [CategoryOrder("Layout", 4)] [CategoryOrder("Background", 5)] ... etc ... public class SomeObject |
Ik vroeg me af of dit niet makkelijker kan, door bijvoorbeeld een custom attribute te maken die 'dynamisch' een lijst van CategoryOrder attributes toevoegt. Dan hoef ik op elke class alleen maar die ene custom attribute te gebruiken, en kan ik de volgorde op een plek aanpassen.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| [MyCategoryOrder] public class SomeObject { [Category("General")] public string Name {get;set;} [Category("Font")] public string FontName {get;set;} [Category("Font")] public int FontSize {get;set;} } public class MyCategoryOrderAttribute : Attribute { // ... ?? // Injecteer een hele waslijst met 'CategoryOrder' attributes } |
Ik kom er echter niet achter of dit uberhaupt mogelijk is. Kan een attribute andere attributes "injecteren"? Waarschijnlijk zal dit niet tijdens runtime maar tijdens design time moeten gebeuren... Dus moet ik dan iets als PostSharp gebruiken wat tijdens design-time extra code kan genereren?
Heeft iemand hier ervaring mee?