जैसा कि आप संदर्भ स्रोतों में देख सकते हैं, NameValueCollection को विरासत में मिला है NameObjectCollectionBase ।
तो आप आधार-प्रकार लेते हैं, प्रतिबिंब के माध्यम से निजी हैशटेबल प्राप्त करते हैं, और जांचते हैं कि इसमें एक विशिष्ट कुंजी है या नहीं।
इसके लिए मोनो में काम करने के लिए, आपको यह देखना होगा कि मोनो में हैशटेबल का नाम क्या है, जो कि आप यहाँ देख सकते हैं हैशटेबल (m_ItemsContainer), और मोनो-फ़ील्ड प्राप्त करें, यदि प्रारंभिक ईएनएफओ null है (मोनो- क्रम)।
ऐशे ही
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);
}
}
अल्ट्रा-प्योर नॉन-रिफ्लेक्टिव .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;
}