Bonjour la communauté,
Je vous soumet un problème que je suis en train de rencontrer.
Contexte:
C# + Xaml.
Depuis un fichier texte, je dois créer un modèle de données.
Un des champs de chaque ligne donne le type de données: ca peut être un champ string, int32, uint64, bool, datetime...
Quasiment tous les types de données possèdent les mêmes propriétés (valeur min, valeur max, valeur défaut, nom,...)
Ces champs seront ensuite affichés à l'utilisateur pour utilisation et modification.
En voyant cela, je suis parti sur l'implémentation que voila:
Code de mon entité:
Code de l'interface
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public class Champ<T>:IChamp { public EType Type { get; set; } public string Nom { get; set; } public int NombreElements { get; set; } public T ValeurMin { get; set; } public T ValeurDefaut { get; set; } public T ValeurMax { get; set; } public T Valeur { get; set; } public bool InhibitionMimMax { get; set; } public Champ() { } ...
Code de mon parser:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public interface IChamp { EType Type { get; set; } string Nom { get; set; } int NombreElements { get; set; } }
Ma couche métier:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public static IChamp CreerChamp(List<string> data) { string type = data[0]; IChamp result = null; if (type.StartsWith("STRING")) { if (type == "STRING") return new ChampString(); else { string nbCaracAsString = type.Remove(0, 7); nbCaracAsString = nbCaracAsString.Remove(nbCaracAsString.IndexOfAny(new char[] { ')' }, 0), 1); result = new ChampString(Convert.ToInt16(nbCaracAsString)); } } switch (type) { case "BOOL": result = new Champ<bool>(); break; case "SBYTE": result = new Champ<char>(); break; case "BYTE": result = new ChampByte(); break; case "SQWORD": result = new Champ<Int64>(); break; ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 private IChamp DecoderChamps(string ligneChamp, Parametre parametreOwner) { List<string> data = ligneChamp.Split(ELEMENT_SEPARATOR).Skip(2).ToList();//suppression des deux premiers champs vides return ChampHelper.CreerChamp(data); }
Mon problème est que je ne peux pas accéder depuis ma couche métier aux éléments de Type T quand j'utilise l'interface IChamp.
Normal vous allez me dire, je ne les ai pas déclaré dans l'interface.
Si je rajoute le typage dans l'interface, j'obtiens:
Mais dans ce cas là, mon code métier ne fonctionne plus car je DOIS typer mon interface... Ce qui ne me va pas car je ne sais quel sera le type des informations de chaque ligne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public interface IChamp<T> { EType Type { get; set; } string Nom { get; set; } int NombreElements { get; set; } T ValeurMin { get; set; } T ValeurDefaut { get; set; } T ValeurMax { get; set; } T Valeur { get; set; } }
Pour résumer:
J'ai des objets qui se "ressemblent" mais dont certaines propriétés sont de types différents.
- Faut-il que j'oublie cette implémentation et partir sur de l'héritage simple? (je ne suis pas certain que cela résoudra tous les problèmes)
- Je pensai à tout mettre en string et ne caster les champs que lorsque nécessaire? Est-ce pertinent?
- D'autres idées pour résoudre ce genre de problématique?
Merci d'avance pour vos avis et votre aide.
Partager