Bonjours à tous
je veux créer des type enum dynamiquement à partie d'un fichier xml au moment de la compilation pour les utiliser
Est ce que quelqu'un peut m'aider
Merci d'avance
Version imprimable
Bonjours à tous
je veux créer des type enum dynamiquement à partie d'un fichier xml au moment de la compilation pour les utiliser
Est ce que quelqu'un peut m'aider
Merci d'avance
Au moment de la compilation, je ne vois pas bien (de plus c'est contradictoire avec ton titre, où tu parles de runtime, pas de compiletime).
Au moment de l'exécution c'est possible avec le code DOM.
ceci dit tu peux faire un utilitaire utilisant le code DOM qui sera lancé au moment de la compilation. (à l'aide des propriétés Custom Tools et tutti quanti).
Je veux bien dire au moment de l'execution puisque j'ai pas une visibilité sur mon xml le fichier xml
Pour quoi tu ne construits pas simplement une liste de String que tu charges via ton fichier xml ?
A tout hasard, voici un exemple de génération d'enum à partir d'une liste de valeurs : (génération du source et génération de l'assembly in-memory).
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 private static string generateEnum(string[] MyVals ) { StringBuilder sbCodeSource = new StringBuilder(); StringWriter sw = new StringWriter(sbCodeSource); CompilerParameters compilerParameters = new CompilerParameters(); compilerParameters.GenerateExecutable = false; compilerParameters.GenerateInMemory = true; compilerParameters.IncludeDebugInformation = false; compilerParameters.WarningLevel = 1; // Invoke compilation. CodeDomProvider provider = CodeDomProvider.CreateProvider( "C#" ); CodeNamespace myNs = new CodeNamespace("MyNameSpace"); CodeCompileUnit compileUnit = new CodeCompileUnit(); compileUnit.Namespaces.Add(myNs); CodeTypeDeclaration enumDeclaration = new CodeTypeDeclaration("MyEnum"); enumDeclaration.IsEnum = true; enumDeclaration.Attributes = MemberAttributes.Public; myNs.Types.Add(enumDeclaration); foreach (string val in MyVals) { CodeMemberField enumField = new CodeMemberField(); enumField.Name = val; enumDeclaration.Members.Add(enumField); } provider.GenerateCodeFromCompileUnit(compileUnit, sw, null); CompilerResults compilerResults = provider.CompileAssemblyFromDom(compilerParameters, compileUnit); if(compilerResults.Errors.Count == 0) { return sbCodeSource.ToString(); } return null; }
mainteneant comment je peux utiliser ce nouveau type généré d'habitude si c'est un type connu string par exemple je met typeof(System.String)
maintenant queceque je vais mettre
Rien compris ...
d'habitude si j'ai un type enum static je l'appelle simplement par son nom et
à ce que j'ai compri la méthode generateEnum va créer un nouveu type Enum
comment je vais l'appeler ?
oui je l'ai lu mais le probléme que le type MyEnum est inconnue (il ne le connait pas encore)
connaitre statiquement !!!
Beh, j'ai l'impression que la question est la suivante :
J'ai un type Toto... et je voudrais le renseigner dynamiquement mais pouvoir l'utiliser "statiquement".. ce qui est un paradoxe total :)
J'vois pas trop l'interet d'avoir un enum en dynamique sauf si c pour génerer du code derrière et encore....
J'ai du mal à expliquer dans quelle situation "courante" ou pas on peut avoir recours à ce genre de mécanisme.. Autant passer par des chaines de caractères à ce moment là...
Comprends pas trop la finalité, désolé :)
J'ai précisément un cas où j'y ai recours : en gros, j'ai besoin de proposer un choix a design-time sur une propriétés d'un contrôle, matérialisée par un enum, dont le contenu dépend d'info externes; bien sur je ne génére pas la source; j'ai rajouté la ligne entrainant la génération de source dans l'exemple uniquement pour des raisons didactiques.
(du fait que j'avais le code sous la main, j'ai pu rapidement expurger mon code pour lui proposer cet exemple).
ceci dit, dans son cas, je soupçonne une mauvaise conception, vu les réquisitions contradictoires qu'il demande.
donc si je reformule ma question
j'ai un fichier xml qui semble à ça
j'ai besoin de générer des types enum pour les utiliserCode:
1
2
3
4
5
6
7
8
9
10
11 <root> <type nom="saison"> <membre>hiver</membre> <membre>ete</membre> </type> <type nom="semaine"> <membre>mardi</membre> <membre>mercredi</membre> </type> </root>
mais mon probléme est du fait que je ne conais pas d'avance les types que je peux les rencontrés dans mon xml
donc j'ai pensé à les générer dynamiquement
j'ai utilisé le code que j'ai sous la main et j'ai vu qu'il retourne un namespace et un type enum mais mon probléme c'est comment utiliser ce code commet
, comment utiliser ce type je n'arrive pas à l'exploiter
Tu te compliques la vie. Pourquoi tu ne crée pas simplement une classe Type avec une propriété Nom et une liste de string contenant les membres ?