Как видно из справочных источников, NameValueCollection наследуется от NameObjectCollectionBase .
Итак, вы берете базовый тип, получаете частную хеш-таблицу через отражение и проверяете, содержит ли она определенный ключ.
Чтобы он работал и в Mono, вам необходимо увидеть имя хеш-таблицы в моно, которое вы можете увидеть здесь (m_ItemsContainer), и получить монополе, если исходное поле FieldInfo имеет значение null (mono- время выполнения).
Как это
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)
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.Hashtable ent = (System.Collections.Hashtable)m_fi.GetValue(nvc);
return ent.ContainsKey(key);
}
}
для сверхчистого неотражающего кода .NET 2.0 вы можете перебирать ключи вместо использования хэш-таблицы, но это медленно.
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;
}