Como você pode ver nas fontes de referência, NameValueCollection herda de NameObjectCollectionBase .
Então você escolhe o tipo base, obtém a hashtable privada por meio de reflexão e verifica se ela contém uma chave específica.
Para que ele funcione também em mono, é necessário ver qual é o nome da hashtable em mono, que é algo que você pode ver aqui (m_ItemsContainer) e obter o mono-campo, se o FieldInfo inicial for nulo (mono- tempo de execução).
Como isso
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);
}
}
para código .NET 2.0 não puro e não refletivo ultra-puro, você pode fazer um loop sobre as chaves, em vez de usar a tabela de hash, mas isso é lento.
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;
}