Như bạn có thể thấy trong các nguồn tham chiếu, NameValueCollection kế thừa từ NameObjectCollectionBase .
Vì vậy, bạn lấy loại cơ sở, lấy hashtable riêng thông qua sự phản chiếu và kiểm tra xem nó có chứa một khóa cụ thể không.
Để nó hoạt động trong Mono, bạn cần xem tên của hashtable là gì trong mono, đây là thứ bạn có thể thấy ở đây (m_ItemsContainer) và lấy trường đơn sắc, nếu FieldInfo ban đầu là null (mono- thời gian chạy).
Như thế này
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);
}
}
đối với mã .NET 2.0 không phản chiếu cực kỳ tinh khiết, bạn có thể lặp qua các phím, thay vì sử dụng bảng băm, nhưng điều đó rất chậm.
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;
}