दिलचस्प पोस्ट
स्ट्रिंग को पायथन में यूटीएफ -8 में कनवर्ट कैसे करें क्या मटप्ललिब भूखंडों को अलग करने का एक तरीका है ताकि गणना जारी रख सकें? मान्य ईमेल पता नियमित अभिव्यक्ति? क्या आप पायथन की सिंटैक्स में नए स्टेटमेंट जोड़ सकते हैं? एक स्ट्रिंग में चर बदलने पीएचएसेट से एनएसURL विशेष वर्णों को छोड़ने के लिए नियमित अभिव्यक्ति UINavigationController बल बारी बारी से HTML तालिका सेल स्वरूपित करें ताकि पाठ के रूप में Excel स्वरूप? जावास्क्रिप्ट में लूप के अंदर कॉलबैक का उपयोग करते समय, कॉलबैक में उपयोग करने के लिए लूप में अपडेट किए गए वैरिएबल को सहेजने का कोई तरीका क्या है? जेवीएम, जेडीके, जेआरई और ओपन जेडीके में क्या अंतर है? जावास्क्रिप्ट सरणियाँ एक दूसरे के बराबर नहीं हो सकतीं? नक्शे में जावा 8 लैम्ब्दा समूह की सूची एंड्रॉयड getIntent ()। GetExtras () रिक्त रिटर्न एक बाधित जेनेरिक प्रकार पैरामीटर पर विरासत

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

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

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

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

Solutions Collecting From Web of "ऑब्जेक्ट सी # में जेनेरिक प्रकार का है अगर परीक्षण"

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

 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;