Probleme avec la reflexion

Signaler
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020
-
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020
-
Salut

Voici mon code

foreach(FieldInfo aFieldInfo in LaClasse.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
{
if(aFieldInfo.FieldType.GetType().IsSubclassOf(Type.GetType("myApp.myClass2")))
{
int i = 3;
}
}

J'essaie en recuperant les membre de savoir lequels sont derive de myClass2, pourtant dans la fenetre espion je le vois bien mais aucune fois il ne rentre dans le if ....

thx @+

Herve

28 réponses

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
34
Salut,

as-tu essayé en faisant :

foreach(FieldInfo aFieldInfo in LaClasse.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
{
   if(aFieldInfo.FieldType.GetType().IsSubclassOf(Type.GetType(typeof(myApp.myClass2))))
   {
      int i = 3;
   }
}

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
34
ooops... sorry :

foreach(FieldInfo aFieldInfo in LaClasse.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
{
   if(aFieldInfo.FieldType.GetType().IsSubclassOf(typeof(myApp.myClass2)))
   {
      int i = 3;
   }
}

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Je vais essaye , merci ...

Mais c'est etrange parce que je fais comment cela autre part et ca marche bien

Herve
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

J'arrive enfin a recuperer ce que je vx ... mais je n'arrive pas a recuperer mon objet ... cad j'ai mon objet de type ABC et j'aimerais bien le recuperer dans un objet de type ABC ..

j'ai regarder dans la MSDN et je fais pareil ... toujours NULL dans mon
objet, ou alors une Exception a cause de qqchose de static !

comment faire ?

Herve
Messages postés
473
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

Salut,

J'ai eu un problème similaire au tient.
Si ton objet est dans une assembly externe, quand tu charges ton assembly essaye ça :
Assembly assembly = Assembly.Load(AssemblyName.GetAssemblyName(Path));

Console.Out.WriteLine("Warny")

Il y a 10 types de personnes
Ceux qui comptent en binaire... et les autres
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Merci...

sinon pour vraiment recuperer l'objet , l'on fait comment ?

Herve
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
16
salut,

si tu veux instancier un objet à partir d'un assembly chargé dynamiquement :
Assembly assembly = Assembly.Load(AssemblyName.GetAssemblyName(Path));
object o = assembly.CreateInstance("espace_de_nom.Classe");

normalement, ca renvoie soit une instance, soit une exception...qui peut venir par exemple d'une ouverture d'un fichier introuvable (à cause d'un mauvais dossier courant...)...dans ce cas, regarde l'exception dans InnerException de l'exception lancée...

sinon reprécise...

ShareVB
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

je debute en c#

question bete : c'est quoi un assembly ?

ma classe est dans le meme projet ...

Herve
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Si j'ai bien compris L'assembly c'est tout ce qui compose le projet :  le programe et les differentes dependances (dll, etc,...)

Herve
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Non, un assembly c'est le fichier contenant le code IL issu de la (semi)compilation, le manifest, les ressources, etc etc
Il y en a en gros 2 sortes : processus (exe) et bibliotheque (dll)

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Ah ok ...donc il s'agit du projet (semi)compile qui donne soit un EXE soit une DLL

merci

Herve
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Oui, suivant les propriétés définies tu obtiens l'un ou l'autre.
Par contre les dépendances n'en font pas partie.

Jette un oeil à ceci : Contenu d'un assembly

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Merci...

Donc mon probleme avec la reflexion ne vient pas d'un probleme d'assembly ?
Ma classe est dans le meme projet ...

Herve
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Désolé je n'avais pas regardé la question d'origine.
Je regarde.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Ha oui mais là ça ne marchera jamais ton test : 
if(aFieldInfo.FieldType.GetType().IsSubclassOf(Type.GetType("myApp.myClass2")))
Pourquoi cet appel ?
Tu veux tester le type du champs, pas le type de la proriété donnant le type du champs
Exemple, si le champs est de type "String" :
aFieldInfo.FieldType donnera une instance de Type décrivant System.String
aFieldInfo.FieldType.GetType() donnera une instance de Type décrivant System.RuntimeType

=> if(aFieldInfo.FieldType.IsSubclassOf(Type.GetType("myApp.myClass2")))

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
(Faut absolument que je perde cette habitude de mettre un 's' à champ moi -_-)

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Ahhh ben oui .... logique !!!

que je suis c** !!
lol

Par contre mon prob etait egalement de recuperer, apres le test du type, l'objet dans un objet avec le bon type ....

par exemple :

if(aFieldInfo.FieldType.IsSubclassOf(Type.GetType("myApp.myClass2")))
{
myClass2 test = ?????
}

Herve
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Avec la méthode FieldInfo.GetValue.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Ben justement c'est ce que je fais :

myClass2 amyClass2 = (myClass2)myFields[i].GetValue(this);

Herve
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
A moins que this représente ici l'instance de la classe contenant le champ (ce qui m'étonnerais car dans ce cas tu aurais directement accès au champ privé...), ton code est faux.

FieldInfo.GetValue, méthode
En cas de substitution dans une classe dérivée, retourne la valeur d'un champ pris en charge par un objet donné.
[...]
Paramètres
   obj
      Objet dont la valeur de champ sera retournée.

/*
coq
MVP Visual C#
CoqBlog
*/