2015-01-06 3 views
6

मैं एक विधि के माध्यम से एक प्रकार को पारित करने की कोशिश कर रहा हूं जहां मैं जांच सकता हूं कि यह एक निश्चित प्रकार है या नहीं। हालांकि मेरे पास नीचे दिया गया कोड संकलित नहीं है और मैं सोच रहा हूं कि क्या गलत है। संकलन त्रुटि है: प्रकार या नामस्थान नाम 'डेटा टाइप' नहीं मिला।विधि के माध्यम से पारित होने पर 'is' का उपयोग कैसे करें?

public static List<object> findType(Type dataType) 
{ 
    List<object> items = new List<object>(); 
    foreach (KeyValuePair<int, object> entry in DataSource.ItemPairs) 
    { 
     if (entry.Value != null && entry.Value is dataType) 
     { 
      items.Add(entry.Value); 
     } 
    } 
    return items; 
} 

उत्तर

9

is ऑपरेटर एक प्रकार का नाम अपेक्षा करता है, Type उदाहरण नहीं। इसलिए प्रकार संकलन समय पर जाना जाना चाहिए।

हालांकि आप उपयोग कर सकते हैं, अगर प्रकार संगत हैं IsAssignableFrom विधि की जाँच करने के:

if (entry.Value != null && dataType.IsAssignableFrom(entry.Value.GetType()) 
2

मुझे लगता है कि आप entry.Value के प्रकार की जांच करना चाहते हैं।

इस प्रयास करें:

if (entry.Value != null && dataType.GetType().IsAssignableFrom(entry.Value)) 

यह dataType उम्मीद अपने आप ही एक प्रकार है, जबकि यह प्रकार Type की एक चर रहा है।

+0

यह 'is' रूप में एक ही बात नहीं है। यह केवल समानता के लिए जांचता है, संगतता नहीं। –

+0

याद रखें, कि 'काम' लगातार काम करता है। मेरा मतलब है कि जब आप जांचते हैं कि मक्खन विशिष्ट व्युत्पन्न वर्ग बेस प्रकार का है तो यह सच हो जाता है (इंटरफेस सहित)। आपके मामले में सरल संपीड़न इस तरह से काम नहीं करता है। –

+0

दाएं। उम्मीद है कि यह अब बेहतर है। –

5

is सी # में एक विशेष संकलित निर्माण है - आप प्रकार के रूप में एक चर नहीं डाल सकते, तो आप एक वास्तविक प्रकार लिखना चाहिए नाम।

आप सटीक प्रकार उपयोग जाँच करना चाहते हैं इस:

if(entry.Value.GetType() == dataType) 

आप अगर यह विरासत में मिला है जाँच करना चाहते हैं, तो आप इस का उपयोग कर सकते हैं:

if (entry.Value != null && dataType.IsAssignableFrom(entry.Value.GetType())) 
0

entry.Value है एक ऑब्जेक्ट, प्रत्येक ऑब्जेक्ट GetType() विधि प्राप्त करता है, जो आपको एक प्रकार ऑब्जेक्ट देता है। टाइप करें। एक्वाल उन प्रकारों की तुलना कर सकते हैं। आप "है" शब्द का उपयोग किए बिना ऐसा कर सकते हैं।

आप नहीं कर सकते का उपयोग शब्द है, क्योंकि एक वस्तु recive करना चाहते हैं "है" और टाइप नहीं

0

के रूप में अच्छी तरह से अन्य कैसे एक Type उदाहरण उपयोग करने के लिए दिखा जवाब, आप अपने विधि सामान्य बना सकता है। यह आपको is का उपयोग करने की अनुमति होगी, लेकिन स्पष्ट रूप से लक्ष्य प्रकार पर निर्भर करता संकलन समय पर तय किया जा रहा:

public static List<object> findType<TTarget>() 
{ 
    List<object> items = new List<object>(); 
    foreach (KeyValuePair<int, object> entry in DataSource.ItemPairs) 
    { 
    if (entry.Value != null && entry.Value is TTarget) 
    { 
     … 
2

आप जेनरिक और LINQ का उपयोग कर सकते हैं, तो चीजें बहुत आसान हो गया है। मान लें कि DataSource.ItemPairs एक शब्दकोश प्रकार है।

public static List<T> findType<T>() 
{ 
    List<T> items = new List<T>(); 
    foreach (T entry in DataSource.ItemPairs.Values.OfType<T>()) 
    { 
     items.Add(entry); 
    } 
    return items; 
} 

या इससे भी छोटा।

public static List<T> findType<T>() 
{ 
    return DataSource.ItemPairs.Values.OfType<T>().ToList(); 
} 
संबंधित मुद्दे

 संबंधित मुद्दे