2010-02-23 16 views
8

है मैं एक IList<Delegate> कि कुछ Func<bool> रों होता है और कुछ Predicate<T> रों मिल गया है, जहां T भिन्न होता है। बाद में मुझे यह पता लगाने की आवश्यकता है कि इनमें से कौन सा आइटम Predicate<T> एस है, लेकिन बाद में सूची में अन्य Delegate प्रकार जोड़ने के लिए दरवाजा बंद नहीं करना चाहते हैं, इसलिए मैं !(current_delegate is Func<bool>) द्वारा ऑब्जेक्ट्स की पहचान करके ऐसा नहीं करना चाहता हूं।निर्धारित करें यदि वस्तु किसी भी विधेय <T>

Predicate<T> नीचे उच्चतम अमूर्त MulticastDelegate, जो बेकार लगता है (Predicate<T> के तहत एक गैर सामान्य Predicate प्रकार की आवश्यकता होगी) है, और सामान्य पैरामीटर की उपस्थिति की पहचान दी अन्य सामान्य Delegate कि में मौजूद हो सकता भी बेकार है सूचि।

एकमात्र अन्य चीज जिसे मैंने माना है Type के Name की जांच कर रहा है। मेरे लिए, स्ट्रिंग तुलना एक गंध की गंध है, लेकिन शायद यह सबसे अच्छा और/या एकमात्र तरीका है - आप मुझे बताओ।

सबसे अच्छा तरीका निश्चित निर्धारित करने के लिए है कि एक object किसी भी Predicate<T>T के प्रकार जानने के बिना है क्या है?

उत्तर

8
इस तरह

:

obj.GetType().GetGenericTypeDefinition() == typeof(Predicate<>) 
+0

पूर्णता। उन चीजों में से एक जो मैं शायद कम से कम साप्ताहिक के लिए एक अच्छा उपयोग खोजने जा रहा हूं। – Jay

+5

हाँ, लेकिन 'अवैधऑपरेशन अपवाद' को पकड़ने के लिए तैयार रहें जो गैर-प्रतिनिधि प्रतिनिधि प्रकारों के लिए फेंक दिया जाएगा - जो लगता है कि वे भविष्य की संभावना हो सकते हैं। परेशानी से बचने के लिए, इस विधि को कॉल करने से पहले 'Type.IsGenericType' देखें। –

0

आपके पास विशेष कक्षाओं की एक सूची हो सकती है जो आपके प्रतिनिधियों को लपेटती हैं और अतिरिक्त सॉर्टिंग जानकारी प्रदान करती हैं। तो आप अप्रत्यक्ष रूप से समस्या को हल करेंगे।

+0

धन्यवाद; सूची लैम्ब्डा अभिव्यक्तियों को पार कर आबादी है, जो इसे लागू करने के लिए महत्वपूर्ण जटिलता को जोड़ती है। – Jay

2
Predicate<int> pred = ...; 
var isPreidcate = pred.GetType().GetGenericTypeDefinition() == typeof(Predicate<>); 

एक और नोट पर, यदि आप एक सामान्य सूची है, तो आप उस में प्रकार जांच करने की आवश्यकता shoulnd't। यदि आपको सूची में विशिष्ट प्रकारों की जांच करने की आवश्यकता है तो आप अपने डिज़ाइन पर पुनर्विचार करना चाहेंगे।

0

यह काफी अच्छी तरह से काम करना चाहिए:

public static bool IsPredicate(object obj) { 
    var ty = obj.GetType(); 
    var invoke = ty.GetMethod("Invoke"); 
    return invoke != null && invoke.ReturnType == typeof(bool); 
} 

चाल हो जाएगा जब आप वास्तव में समारोह कॉल करना चाहते हैं, तो आप प्रतिबिंब का उपयोग करने की आवश्यकता होगी।

यहाँ कुछ परीक्षण कर रहे हैं:

Func<bool> is pred? True 
Func<int, bool> is pred? True 
Predicate<int> is pred? True 
Func<int> is pred? False 
संबंधित मुद्दे