Seperti yang dapat Anda lihat di sumber referensi, NameValueCollection mewarisi dari NameObjectCollectionBase .
Jadi Anda mengambil tipe dasar, dapatkan hashtable pribadi melalui refleksi, dan periksa apakah itu berisi kunci tertentu.
Agar dapat bekerja di Mono juga, Anda perlu melihat apa nama hashtable di mono, yang merupakan sesuatu yang dapat Anda lihat di sini (m_ItemsContainer), dan dapatkan bidang-mono, jika FieldInfo awal adalah null (mono- runtime).
Seperti ini
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);
}
}
untuk kode .NET 2.0 ultra-murni non-reflektif, Anda dapat mengulangi kunci, alih-alih menggunakan tabel hash, tapi itu lambat.
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;
}