11
votes

C # Réflexion - Comment puis-je dire si l'objet O est de type keyvaluepair et de le jeter?

Je tente actuellement d'écrire une méthode de décharge () de Linqpad équivalent IIN C # pour mon propre amusement. Je bouge de Java en C # et c'est un exercice plutôt qu'une entreprise. J'ai presque tout ce qui fonctionne, sauf pour dumping un dictionnaire.

Le problème est que KeyvaluePair est un type de valeur. Pour la plupart des autres types de valeur, je appelle simplement la méthode de totring, mais cela est insuffisant car le keyValuePairpair peut contenir des énumérables et d'autres objets avec des méthodes de totrage indésirables. Donc, j'ai besoin de travailler si c'est un keyvaluepair puis je le jette. En Java, je pourrais utiliser des génériques Wildcard pour cela, mais je ne connais pas l'équivalent en C #.

Votre quête, étant donné un objet O, déterminer s'il s'agit d'un keyValuePair et d'appeler l'impression sur sa clé et sa valeur. < / p> xxx

merci!


0 commentaires

3 Réponses :


-1
votes

1 commentaires

Je pense que cela est problématique avec les génériques. Depuis KeyValuePair n'est pas la même chose que KeyvaluePair .. Et il ne se soucie pas de ce type qu'il est, tant qu'il y a une .tostring () .. (T: classe )



42
votes

Si vous ne connaissez pas les types stockés dans le KeyValuePair CODE> Vous devez faire de l'exercice d'un peu de code de réflexion.

Regardons ce qui est nécessaire: P>

Premier , assurons que la valeur n'est pas null code>: p>

object kvpKey = valueType.GetProperty("Key").GetValue(value, null);
object kvpValue = valueType.GetProperty("Value").GetValue(value, null);


2 commentaires

J'étais sur le point de suggérer exactement ça .. :) bonne réponse


Sur .NET 4.7 et .NET CORE Le BaseType renvoie System.valueType



1
votes

présumer que vous utilisez le générique KeyValuePairPair, vous devez probablement vouloir vérifier une instanciation particulière, telle que celle créée à l'aide d'une chaîne pour la clé et la valeur:

public void Print(object o) 
{
    if (o == null)
        return;

    if (o is KeyValuePair<string, string>)
    {
        KeyValuePair<string, string> pair = (KeyValuePair<string, string>)o;
        Console.WriteLine("{0} = {1}", pair.Key, pair.Value);
    }
}


0 commentaires