2010-09-13 5 views
0

J'ai une classe avec une propriété Items, qui est un IList:Accès aux éléments dans un IList avec C# Réflexion

class Stuff { 
    IList<OtherStuff> Items; 
} 

Je veux être en mesure de recevoir une chaîne dans une méthode (je pensais que ce format à l'origine: Items [0]) et être capable de récupérer le premier élément de la liste Items.

J'ai essayé ceci:

object MyMethod(string s, object obj) { 
    return obj.GetType().GetProperty(s).GetValue(obj,null); 
} 

avec s étant « Articles [0] » mais il ne fonctionne pas ... aussi essayé le paramètre analyse syntaxique pour accéder uniquement la propriété « » Les produits de l'objet et puis accéder à l'index (sachant que c'est un IList).

Aucune de ces approches n'a fonctionné ... Des pensées?

des pensées?

+1

Dans votre exemple, 'Items' est un champ et non une propriété. –

+0

Plus le problème est simple, plus il est difficile de trouver ... c'était le problème Chris, merci –

+0

Chris devrait-il ajouter cela comme réponse et vous pouvez accepter sa réponse pour que les autres connaissent la bonne réponse? !! –

Répondre

0

Comme Chris a posté la réponse en commentaire, je vais après Hera comme une réponse:

articles était pas une propriété, donc mes démarches ne fonctionneraient pas. Ça devrait l'être, alors je l'ai transformé en une propriété et maintenant ça marche bien. Merci Chris ...

1

Vous pouvez accéder à la propriété, puis vous pouvez la convertir en liste.

T GetListItem<T>(object obj, string property, int index) 
{ 
    return (obj.GetType().GetProperty(property).GetValue(obj, null) as IList<T>)[index]; 
} 

Exemple de travail pour votre exemple de code:

OtherStuff item = GetListItem<OtherStuff>(obj, "Items", 0); 
+0

En fait, c'était ma deuxième tentative que j'ai essayé de montrer ci-dessus, mais obj.GetType(). GetProperty (propriété) retourne null pour moi. Ça ne devrait pas? Si c'est le cas, cela signifie que le problème est ailleurs, et je dois regarder de plus près ici. –

0

Si vous voulez tester un objet pour voir si elle a un indexeur numérique, sans se demander si elle est un IList, puis invoquez la indexer via la réflexion, vous pouvez essayer cette méthode.

Il renvoie true si l'objet a un indexeur et remplit value avec la valeur de l'index 0e.

public static bool TryGetFirstIndexWithReflection(object o, out object value) 
{ 
    value = null; 

    // find an indexer taking only an integer... 
    var property = o.GetType().GetProperty("Item", new Type[] { typeof(int) }); 

    // if the property exists, retrieve the value... 
    if (property != null) 
    { 
     value = property.GetValue(list, new object[] { 0 }); 
     return true; 
    } 

    return false; 
} 

Notez que cet exemple ne cherche pas à gérer correctement les exceptions, telles que IndexOutOfRangeException. C'est à vous d'ajouter si vous le trouvez pertinent.

-1

Vous devriez essayer ceci:

object GetFirstItemByReflection(object obj) { 
    return obj.GetType().GetMethod("get_Item").Invoke(obj, new object[] { 0 }); 
} 

avec les contrôles appropriés. "Get_Item" est la méthode "générée" utilisée lorsque vous accédez à des éléments par index dans une collection. Lorsque vous obtenez MethodInfo, vous l'appelez sur votre collection, en lui passant le paramètre "0", pour obtenir le premier élément.

Questions connexes