Reflexion Bindinglist

cs_jcg56123 Messages postés 6 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 29 mai 2009 - 28 mai 2009 à 21:20
cs_jcg56123 Messages postés 6 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 29 mai 2009 - 29 mai 2009 à 12:42
Bonjour je cherche à détecter via réflexion toutes les bidinglist contenues dans un object.

J'ai essayer le code ci-dessous mais ça ne marche pas... Même après une journée sur la doc, je cale.

Type type = o.GetType();
            FieldInfo[] fi = type.GetFields();
            foreach (FieldInfo f in fi)
            {
                //if (typeof(BindingList<>).IsAssignableFrom(f.FieldType))
                MessageBox.Show(f.ToString() + " " + typeof(BindingList<>).ToString());
                if( f.FieldType.IsAssignableFrom(typeof(BindingList<>)))
                {
                    BindingList<Object> bl = (BindingList<Object>)f.GetValue(o);
                

4 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
29 mai 2009 à 08:20
Salut,
Pour info, GetFields retour les variables de classes qui sont public. Donc si elles sont private, ça marchera pas comme ça...
Ensuite, tu cherches bien les variables de classes? pas les Properties?

Pour les Properties, ça donnerait quelques chose comme ceci (similaire pour les variables de classes) :

Type type = c.GetType();
PropertyInfo[] fi = type.GetProperties();
foreach (PropertyInfo f in fi)
{
   if (f.PropertyType == typeof(BindingList<XXX>))
   {
   }
}





<hr />
-Blog-
-Site Perso-
0
cs_jcg56123 Messages postés 6 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 29 mai 2009
29 mai 2009 à 09:49
Merci pour ton aide bidou !

C'est bien les Fields donc les variables publiques que je recherche !
Malheuresement je ne peut pas utiliser le test de type que tu me propose car je ne connais pas le type des éléments dans les bidinglists. J'ai essayé la méthodes assignableFrom. Je m'y prend peut-être comme un manche ..

Je suis d'accord pour tout ton code mais comment tester que j'ai au moins une bidinglist qui pourrait être caster en BidingList<Object> et pouvoir la parcourir ..
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
29 mai 2009 à 11:56
Pour info:
En C# 3.5 et inférieur, on ne peut pas convertir IEnumerable<XXXX> en IEnumerable<object>
En C# 4.0 par contre, la covariance a été implémentée et la conversion est donc possible.

Pour ton problème:
Je ne sais pas trop... je peux te donner une solution temporaire:

Type type = c.GetType();

FieldInfo[] fi = type.GetFields();

foreach (
FieldInfo f
in fi)
{
   bool x f.FieldType.UnderlyingSystemType.Name
"BindingList`1";
}

Mais je dirais que ça ressemble plus à du bricolage qu'autre chose...
Y'a probablement un moyen plus propre de faire ça !?

<hr />
-Blog-
-Site Perso-
0
cs_jcg56123 Messages postés 6 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 29 mai 2009
29 mai 2009 à 12:42
Je suis arrivé à ceci... C'est tout sauf sexy ... :( tout sauf reflexif comme je voudrais

Type type = o.GetType();
PropertyInfo[] fi = type.GetProperties();
foreach(PropertyInfo f in fi)
{
if(f.PropertyType.ToString().Contains("BindingList"))
{
Object unknowList = f.GetValue(o, null);
 
if(unknowList is BindingList<XXX>)
{
BindingList<XXX> listNiv = (BindingList<XXX>)unknowList;
foreach(Niveau n in listNiv)
{
DoWork();
}
}
}
}
0
Rejoignez-nous