J'ai une instance qui implémente IDictionary<T, K>
, je ne connais pas T et K à compiletime, et je veux en extraire tous les éléments. Je ne veux pas utiliser IEnumerable
pour une raison quelconque, qui serait la seule interface non générique implémentée par IDictionary
.Obtention des valeurs d'un IDictionary générique en utilisant la réflexion
code Je jusqu'à présent:
// getting types
Type iDictType = instance.GetType().GetInterface("IDictionary`2");
Type keyType = iDictType.GetGenericArguments()[0];
Type valueType = iDictType.GetGenericArguments()[1];
// getting the keys
IEnumerable keys = (IEnumerable)dictType.GetProperty("Keys")
.GetValue(instance, null);
foreach (object key in keys)
{
// ==> this does not work: calling the [] operator
object value = dictType.GetProperty("Item")
.GetValue(instance, new object[] {key });
// getting the value from another instance with TryGet
MethodInfo tryGetValue = iDictType.GetMethod("TryGetValue");
object[] arguments = new object[] { key, null };
bool hasElement = (bool)tryGetValue.Invoke(otherInstance, arguments);
object anotherValue = arguments[1];
}
Je pourrais aussi appeler TryGetValue, mais je pense qu'il devrait être possible d'appeler l'opérateur []. Quelqu'un peut-il m'aider?
Je ne suis pas sûr de comprendre la question. Voulez-vous utiliser l'opérateur [] au lieu d'obtenir la valeur de la propriété Item via Reflection? – Andy
J'ai essayé cela avec un dictionnaire et la tentative d'utiliser l'indexeur/get_Item fonctionne pour moi. –
Gishu
@Andy: L'opérateur [] appelle réellement une propriété Item à l'exécution, qui n'est pas visible au moment de la compilation. @Gishu: comment avez-vous appelé l'indexeur? N'y a-t-il pas de propriété 'Item', seulement une méthode 'get_Item'? –