Comme vous pouvez le voir dans les sources de référence, NameValueCollection hérite de NameObjectCollectionBase .
Vous prenez donc le type de base, obtenez la table de hachage privée par réflexion et vérifiez si elle contient une clé spécifique.
Pour que cela fonctionne également en Mono, vous devez voir quel est le nom de la table de hachage en mono, ce que vous pouvez voir ici (m_ItemsContainer), et obtenir le champ mono, si le FieldInfo initial est nul (mono- Durée).
Comme ça
public static class ParameterExtensions
{
private static System.Reflection.FieldInfo InitFieldInfo()
{
System.Type t = typeof(System.Collections.Specialized.NameObjectCollectionBase);
System.Reflection.FieldInfo fi = t.GetField("_entriesTable", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
if(fi == null) // Mono
fi = t.GetField("m_ItemsContainer", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
return fi;
}
private static System.Reflection.FieldInfo m_fi = InitFieldInfo();
public static bool Contains(this System.Collections.Specialized.NameValueCollection nvc, string key)
{
//System.Collections.Specialized.NameValueCollection nvc = new System.Collections.Specialized.NameValueCollection();
//nvc.Add("hello", "world");
//nvc.Add("test", "case");
// The Hashtable is case-INsensitive
System.Collections.Hashtable ent = (System.Collections.Hashtable)m_fi.GetValue(nvc);
return ent.ContainsKey(key);
}
}
pour le code .NET 2.0 ultra-pur non réfléchissant, vous pouvez boucler sur les clés, au lieu d'utiliser la table de hachage, mais c'est lent.
private static bool ContainsKey(System.Collections.Specialized.NameValueCollection nvc, string key)
{
foreach (string str in nvc.AllKeys)
{
if (System.StringComparer.InvariantCultureIgnoreCase.Equals(str, key))
return true;
}
return false;
}