Envoyé par
Philoulheinz
Le but de ma classe DataObject, c'est que plusieurs type d'objet pourront l'étendre (une classe User, une classe Company, une classe News, ...), si je prends par exemple la fonction List<User> FindAll()
Comment lui spécifier le type d'objet (User ? Company ? News ?) qu'elle va devoir me rendre ? Je suppose que c'est ici que va intervenir, entre autre, la réflexion ?
Oui tout à fait, grâce à la réflexion, on va pouvoir créer tout simplement une instance du type courant.
Tout d'abord, il faut savoir qu'avec la réflexion, on joue beaucoup avec la classe Type qui est le "coeur" de la réflexion dans le sens que c'est grâce à cette classe abstraite qu'on va pouvoir accéder aux métadonnées d'une classe donnée.
Pour ce faire, tout les types du framework ainsi que ceux que tu vas créer à l'avenir proposent la méthode GetType() pour récupérer une instance Type de l'objet en question.
En écrivant ceci à l'intérieur de la classe, tu vas pouvoir récupérer l'objet Type correspondant :
Type monType = this.GetType();
Si tu as écrit ceci dans :
- La classe User, tu auras les informations de la classe User;
- La classe Company, tu auras les informations de la classe Company;
- La classe DataObject, tu auras les informations de la classe qui hérite de DataObject (vive l'héritage);
Voila, tu as ton instance de Type qui te donne les informations de la classe courante mais c'est tout. Toi il te faut une instance de User, Company, ... C'est ici qu'intervient la classe Activator avec sa méthode statique CreateInstance qui permet d'instancier un objet à partir d'un Type.
Si on continue le code ci dessous, on aura :
object monObjet = System.Activaror.CreateInstance(monType);
Comme tu peux le voir, on récupère un instance de type Object qui est la classe de base du framework Dotnet, tout objet dérive du type Object que tu le veuilles ou pas, tu n'as pas le choix
Il ne te reste plus qu'à caster correctement l'objet précédemment instancié. Comme tu peux le voir dans le code que je t'ai proposé hier, j'ai casté l'objet en DataObject directement dans la classe du même nom. La raison est que ça te permet d'avoir un code générique que tu n'auras pas besoin de re-écrire dans ta classe Company, ni dans User, encore moins dans une autre classe.
DataObject monDataObject = monObjet as DataObject;
Cependant, si tu désires de spécialiser ton code dans la classe User par exemple, rien ne t'empêche de caster l'objet en User.
Au passage, je viens de remarquer uen faute de ma part dans la méthode FindAll que je t'ai proposé ; Dedans, j'utilise des types User alors que le code doit être générique pour ne pas se soucier du type dont il a affaire, pour cela, j'aurais du écrire :
1 2 3 4 5
| public List<DataObject> FindAll()
{
...
List<DataObject> objDataObjects = new List<DataObject>(); // Et non List<User> objUsers = new List<User>();
} |
Voila, en espérant ne pas m'être trop étalé, n'hésite pas si il reste des points sombres (je ne sais pas du tout si tu as des bonnes notions de tout ce qui est héritage et compagnie).
Partager