Referans kaynaklarında görebileceğiniz gibi, NameValueCollection NameObjectCollectionBase öğesinden devralır .
Böylece taban türünü alırsınız, özel hashtable'ı yansıma yoluyla alırsınız ve belirli bir anahtar içerip içermediğini kontrol edersiniz.
Mono'da da çalışması için, hashtable adının mono olarak ne olduğunu görmeniz gerekir, bu da burada görebileceğiniz bir şeydir (m_ItemsContainer) ve başlangıç FieldInfo boşsa (mono- Çalışma süresi).
Bunun gibi
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);
}
}
ultra saf yansıtıcı olmayan .NET 2.0 kodu için, hash tablosunu kullanmak yerine anahtarlar arasında geçiş yapabilirsiniz, ancak bu yavaştır.
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;
}