दिलचस्प पोस्ट
भौतिक डिजाइन में एप कॉमप्लेट का उपयोग करते हुए प्रासंगिक कार्य बार को कैसे अनुकूलित करें एपीसी बनाम एक्सेलरेटर बनाम एक्सकैच जावा में एएससीआईआई में स्ट्रिंग का हेक्स परिवर्तित करें एक बुफ़र्ड इमेज पर ओवरले टेक्स्ट के लिए ग्राफिक्स 2 डी का उपयोग करना और एक बफर्ड इमेज वापस करना लिनक्स पर एक जेएनआई आवेदन के लिए गतिशील पुस्तकालय कैसे संकलित करें? कैसे एक छवि को बाएं से दाएं Android में ले जाएं जावास्क्रिप्ट दोनों में "ऑब्जेक्ट इंस्टॉलेशन फंक्शन" और "फंक्शन इंस्टॉलेशन ऑफ ऑब्जेक्ट" दोनों में क्यों सच हो? System.console () शून्य पर रिटर्न करता है सी टाइपेड और स्ट्रक्चर प्रश्न जैक्सन जे एससन के साथ: अपरिचित क्षेत्र, जिसे अनावश्यक रूप से चिह्नित नहीं किया गया एक एनएसएसटीइंग को एनएसएनम्बर में कैसे परिवर्तित करें आईओएस: दस्तावेज़ फ़ोल्डर में एक फ़ाइल कॉपी करें एंड्रॉइड में पुनरावृत्त गतिशील जेएसएन स्ट्रिंग के माध्यम से लूप करने में असमर्थ बंदर पायथन में दूसरे मॉड्यूल में एक क्लास को पैचिंग करना सबसे बड़ा पूर्णांक जो एक डबल में संग्रहीत किया जा सकता है

ऑब्जेक्ट सी # में जेनेरिक प्रकार का है अगर परीक्षण

यदि कोई ऑब्जेक्ट एक सामान्य प्रकार का है तो मैं एक परीक्षण करना चाहता हूं। मैंने सफलता के बिना निम्नलिखित कोशिश की है:

public bool Test() { List<int> list = new List<int>(); return list.GetType() == typeof(List<>); } 

मैं क्या कर रहा हूं और मैं यह परीक्षण कैसे कर सकता हूं?

वेब के समाधान से एकत्रित समाधान "ऑब्जेक्ट सी # में जेनेरिक प्रकार का है अगर परीक्षण"

यदि आप यह देखना चाहते हैं कि यह एक सामान्य प्रकार का उदाहरण है:

 return list.GetType().IsGenericType; 

यदि आप यह देखना चाहते हैं कि यह एक सामान्य List<T> :

 return list.GetType().GetGenericTypeDefinition() == typeof(List<>); 

जैसा कि जॉन बताता है, यह सटीक प्रकार तुल्यता की जांच करता है लौटते हुए false मतलब जरूरी नहीं है कि list is List<T> false रिटर्न करती false (अर्थात वस्तु को List<T> चर में निर्दिष्ट नहीं किया जा सकता है)।

मुझे लगता है कि आप केवल यह जानना नहीं चाहते हैं कि टाइपिंग सामान्य है या नहीं, लेकिन यदि कोई ऑब्जेक्ट किसी विशेष सामान्य प्रकार का उदाहरण है, तो टाइप तर्कों को जानने के बिना।

यह बहुत आसान नहीं है, दुर्भाग्य से। यह बहुत बुरा नहीं है यदि सामान्य प्रकार एक वर्ग है (जैसा कि इस मामले में है) लेकिन इंटरफेस के लिए यह कठिन है। यहां एक कक्षा के लिए कोड है:

 using System; using System.Collections.Generic; using System.Reflection; class Test { static bool IsInstanceOfGenericType(Type genericType, object instance) { Type type = instance.GetType(); while (type != null) { if (type.IsGenericType && type.GetGenericTypeDefinition() == genericType) { return true; } type = type.BaseType; } return false; } static void Main(string[] args) { // True Console.WriteLine(IsInstanceOfGenericType(typeof(List<>), new List<string>())); // False Console.WriteLine(IsInstanceOfGenericType(typeof(List<>), new string[0])); // True Console.WriteLine(IsInstanceOfGenericType(typeof(List<>), new SubList())); // True Console.WriteLine(IsInstanceOfGenericType(typeof(List<>), new SubList<int>())); } class SubList : List<string> { } class SubList<T> : List<T> { } } 

संपादित करें: जैसा कि टिप्पणियों में बताया गया है, यह इंटरफेस के लिए काम कर सकता है:

 foreach (var i in type.GetInterfaces()) { if (i.IsGenericType && i.GetGenericTypeDefinition() == genericType) { return true; } } 

मेरे पास चुपके से संदेह है कि इसके चारों ओर कुछ अजीब बढ़त के मामले हो सकते हैं, लेकिन मैं इसे अभी तक नहीं मिल पा रहा हूं।

आप गतिशील althougth का उपयोग कर कम कोड का उपयोग कर सकते हैं यह शुद्ध प्रतिबिंब से धीमी हो सकती है:

 public static class Extension { public static bool IsGenericList(this object o) { return IsGeneric((dynamic)o); } public static bool IsGeneric<T>(List<T> o) { return true; } public static bool IsGeneric( object o) { return false; } } var l = new List<int>(); l.IsGenericList().Should().BeTrue(); var o = new object(); o.IsGenericList().Should().BeFalse(); 

ये मेरे दो पसंदीदा विस्तार विधियां हैं जो सामान्य प्रकार की जांच के सबसे बढ़ते मामलों को कवर करते हैं:

के साथ काम करता है:

  • एकाधिक (सामान्य) इंटरफेस
  • एकाधिक (सामान्य) आधार वर्ग
  • एक अधिभार है जो कंक्रीट जेनेरिक प्रकार को 'बाहर' कर देगा अगर यह सही होता है (नमूने के लिए इकाई परीक्षण देखें):

     public static bool IsOfGenericType(this Type typeToCheck, Type genericType) { Type concreteType; return typeToCheck.IsOfGenericType(genericType, out concreteType); } public static bool IsOfGenericType(this Type typeToCheck, Type genericType, out Type concreteGenericType) { while (true) { concreteGenericType = null; if (genericType == null) throw new ArgumentNullException(nameof(genericType)); if (!genericType.IsGenericTypeDefinition) throw new ArgumentException("The definition needs to be a GenericTypeDefinition", nameof(genericType)); if (typeToCheck == null || typeToCheck == typeof(object)) return false; if (typeToCheck == genericType) { concreteGenericType = typeToCheck; return true; } if ((typeToCheck.IsGenericType ? typeToCheck.GetGenericTypeDefinition() : typeToCheck) == genericType) { concreteGenericType = typeToCheck; return true; } if (genericType.IsInterface) foreach (var i in typeToCheck.GetInterfaces()) if (i.IsOfGenericType(genericType, out concreteGenericType)) return true; typeToCheck = typeToCheck.BaseType; } } 

यहां (मूल) कार्यक्षमता प्रदर्शित करने के लिए एक परीक्षण है:

  [Test] public void SimpleGenericInterfaces() { Assert.IsTrue(typeof(Table<string>).IsOfGenericType(typeof(IEnumerable<>))); Assert.IsTrue(typeof(Table<string>).IsOfGenericType(typeof(IQueryable<>))); Type concreteType; Assert.IsTrue(typeof(Table<string>).IsOfGenericType(typeof(IEnumerable<>), out concreteType)); Assert.AreEqual(typeof(IEnumerable<string>), concreteType); Assert.IsTrue(typeof(Table<string>).IsOfGenericType(typeof(IQueryable<>), out concreteType)); Assert.AreEqual(typeof(IQueryable<string>), concreteType); } 
 return list.GetType().IsGenericType;