दिलचस्प पोस्ट
टाइम पिक्चरडायलोग और AM या प्रधानमंत्री सी में संदर्भ से पासिंग स्ट्रिंग में वर्णों की एक सूची को निकालना 24 घंटे का समय बदलने के लिए 12 घंटे का समय w / AM और PM जावास्क्रिप्ट का उपयोग कर विशिष्ट यूआरएल खोलने के लिए ब्राउजर पर एक इरादा भेजना एक .net ऑब्जेक्ट के आकार का पता लगाएं हटाए जाने वाले कॉलबैक रननबल को रोक नहीं सकते हैं संस्करण नियंत्रण (यानी उपवर्तन) दस्तावेज़ ट्रैकिंग में लागू है? फ्लेक्सबॉक्स में एक छवि पर केंद्र पाठ क्या एकटन को एकता कंटेनर का उपयोग करने या इसे आवेदन के माध्यम से पास करने के लिए बेहतर बनाना है? ओपनसीवी में अर्द्ध-सर्कल का पता लगाएं कैसे एक सी समारोह में स्विफ्ट तार की एक सरणी को पार करने के लिए एक char ** पैरामीटर ले एक ईमेल भेजने के लिए ACTION_SENDTO कैसे variadic टेम्पलेट तर्कों को स्टोर करने के लिए? जावास्क्रिप्ट द्वारा अपडेट होने के बाद परिवर्तित HTML सामग्री प्राप्त करें? (htmlunit)

सी # सामान्य सूची <टी> टी के प्रकार कैसे प्राप्त करें?

मैं एक प्रतिबिंब परियोजना पर काम कर रहा हूं, और अब मैं फंस गया हूँ। यदि मेरे पास "मायक्लस" का कोई ऑब्जेक्ट है जो सूची को पकड़ सकता है तो किसी को भी पता है कि नीचे दिए गए कोड के रूप में कैसे टाइप किया जाए, यदि संपत्ति myclass.SomList खाली है?

List<myclass> myList = dataGenerator.getMyClasses(); lbxObjects.ItemsSource = myList; lbxObjects.SelectionChanged += lbxObjects_SelectionChanged; private void lbxObjects_SelectionChanged(object sender, SelectionChangedEventArgs e) { Reflect(); } Private void Reflect() { foreach (PropertyInfo pi in lbxObjects.SelectedItem.GetType().GetProperties()) { switch (pi.PropertyType.Name.ToLower()) { case "list`1": { // This works if the List<T> contains one or more elements. Type tTemp = GetGenericType(pi.GetValue(lbxObjects.SelectedItem, null)); // but how is it possible to get the Type if the value is null? // I need to be able to create a new object of the type the generic list expect. // Type type = pi.getType?? // how to get the Type of the class inside List<T>? break; } } } } private Type GetGenericType(object obj) { if (obj != null) { Type t = obj.GetType(); if (t.IsGenericType) { Type[] at = t.GetGenericArguments(); t = at.First<Type>(); } return t; } else { return null; } } 

वेब के समाधान से एकत्रित समाधान "सी # सामान्य सूची <टी> टी के प्रकार कैसे प्राप्त करें?"

 Type type = pi.PropertyType.PropertyType; if(type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>)) { Type itemType = type.GetGenericArguments()[0]; // use this... } 

अधिक सामान्यतः, किसी भी IList<T> को समर्थन देने के लिए, आपको इंटरफेस की जांच करना होगा:

 foreach (Type interfaceType in type.GetInterfaces()) { if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IList<>)) { Type itemType = type.GetGenericArguments()[0]; // do something... break; } } 

एक ऐसी वस्तु को देखते हुए जिसे मुझे किसी प्रकार के IList<> होने का संदेह है IList<> , मैं यह कैसे तय कर सकता हूं कि यह एक IList<> ?

यहां गपशप समाधान है यह मानता है कि आपके पास परीक्षण करने के लिए वास्तविक वस्तु है (एक Type बजाय)।

 public static Type ListOfWhat(Object list) { return ListOfWhat2((dynamic)list); } private static Type ListOfWhat2<T>(IList<T> list) { return typeof(T); } 

उदाहरण उपयोग:

 object value = new ObservableCollection<DateTime>(); ListOfWhat(value).Dump(); 

प्रिंटों

 typeof(DateTime) 

मार्क का जवाब यह है कि मैं इसके लिए उपयोग करता हूं, लेकिन सादगी के लिए (और मैत्रीपूर्ण एपीआई?) आप संग्रह आधार वर्ग में एक संपत्ति को परिभाषित कर सकते हैं यदि आपके पास ऐसा कोई है:

 public abstract class CollectionBase<T> : IList<T> { ... public Type ElementType { get { return typeof(T); } } } 

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

एक ऐसी वस्तु को देखते हुए जिसे मुझे किसी प्रकार के IList<> होने का संदेह है IList<> , मैं यह कैसे तय कर सकता हूं कि यह एक IList<> ?

यहाँ एक विश्वसनीय समाधान है लंबाई के लिए मेरी माफी – सी # के आत्मनिरीक्षण एपीआई इस आश्चर्यजनक रूप से कठिन बना देती है

 /// <summary> /// Test if a type implements IList of T, and if so, determine T. /// </summary> public static bool TryListOfWhat(Type type, out Type innerType) { Contract.Requires(type != null); var interfaceTest = new Func<Type, Type>(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IList<>) ? i.GetGenericArguments().Single() : null); innerType = interfaceTest(type); if (innerType != null) { return true; } foreach (var i in type.GetInterfaces()) { innerType = interfaceTest(i); if (innerType != null) { return true; } } return false; } 

उदाहरण उपयोग:

  object value = new ObservableCollection<int>(); Type innerType; TryListOfWhat(value.GetType(), out innerType).Dump(); innerType.Dump(); 

रिटर्न

 True typeof(Int32)