मैं जानता हूँ कि इस सवाल का कई साल पहले पूछा गया था, लेकिन यह अभी भी सार्वजनिक रूप से दिखाई देता है।
कुछ इस विषय में यहाँ प्रस्तावित उदाहरण थे और में यह एक:
Determine if type is dictionary [duplicate]
लेकिन वहाँ कुछ बेमेल हैं, इसलिए मैं अपने समाधान साझा करना चाहते हैं
लघु जवाब:
var dictionaryInterfaces = new[]
{
typeof(IDictionary<,>),
typeof(IDictionary),
typeof(IReadOnlyDictionary<,>),
};
var dictionaries = collectionOfAnyTypeObjects
.Where(d => d.GetType().GetInterfaces()
.Any(t=> dictionaryInterfaces
.Any(i=> i == t || t.IsGenericType && i == t.GetGenericTypeDefinition())))
लंबा उत्तर:
मेरा मानना है कि यह कारण है कि लोगों को गलती करते हैं:
//notice the difference between IDictionary (interface) and Dictionary (class)
typeof(IDictionary<,>).IsAssignableFrom(typeof(IDictionary<,>)) // true
typeof(IDictionary<int, int>).IsAssignableFrom(typeof(IDictionary<int, int>)); // true
typeof(IDictionary<int, int>).IsAssignableFrom(typeof(Dictionary<int, int>)); // true
typeof(IDictionary<,>).IsAssignableFrom(typeof(Dictionary<,>)); // false!! in contrast with above line this is little bit unintuitive
तो कहते हैं कि हम इस प्रकार की है:
public class CustomReadOnlyDictionary : IReadOnlyDictionary<string, MyClass>
public class CustomGenericDictionary : IDictionary<string, MyClass>
public class CustomDictionary : IDictionary
और इन उदाहरणों:
var dictionaries = new object[]
{
new Dictionary<string, MyClass>(),
new ReadOnlyDictionary<string, MyClass>(new Dictionary<string, MyClass>()),
new CustomReadOnlyDictionary(),
new CustomDictionary(),
new CustomGenericDictionary()
};
इसलिए यदि हम का उपयोग करेगा IsAssignableFrom() विधि:
var dictionaries2 = dictionaries.Where(d =>
{
var type = d.GetType();
return type.IsGenericType && typeof(IDictionary<,>).IsAssignableFrom(type.GetGenericTypeDefinition());
}); // count == 0!!
हम किसी भी उदाहरण नहीं मिलेगा
तो सबसे अच्छा तरीका है कि उनमें से कोई शब्दकोश इंटरफेस है सभी इंटरफ़ेस मिलता है और जांच करने के लिए है:
var dictionaryInterfaces = new[]
{
typeof(IDictionary<,>),
typeof(IDictionary),
typeof(IReadOnlyDictionary<,>),
};
var dictionaries2 = dictionaries
.Where(d => d.GetType().GetInterfaces()
.Any(t=> dictionaryInterfaces
.Any(i=> i == t || t.IsGenericType && i == t.GetGenericTypeDefinition()))) // count == 5
यह शायद प्रतिबिंब का उपयोग करने से बॉक्स किए गए मूल्य का उपयोग करके बेहतर प्रदर्शन करेगा। –
मुझे यकीन नहीं है कि आपका क्या मतलब है? इससे मूल्य निकालने के लिए आप केवल एक KeyValuePair बॉक्स नहीं कर सकते हैं। –
आपका समाधान काम किया। मैंने आगे बढ़ने के लिए अगर कथन बदल दिया है और बस "IDictionary" का परीक्षण करें (आपके टाइप का हिस्सा कुछ कारणों से काम नहीं करता है)। मैंने "टाइपबॉक्स (KeyValuePair <,>)" को "सूची बॉक्स" चयनित " –