2013-02-14 83 views
8

मैं इस वर्गसी #: कैसे बताना है कि कोई ऑब्जेक्ट कस्टम क्लास या मूल प्रकार/.NET क्लास का है या नहीं?

public class MyViewModel { 
    public MyClass Thing { get; set; } 
    public int Id { get { return Thing.Id; } } 
    public string Name { get { return Thing.Name; } } 
} 

मैंने देखा जब मैं इसे एक ASP.NET GridView करने के लिए बाध्य है, यह स्वतः ही Thing को छोड़ देता है, और एक अच्छे कारण के लिए (यानी। क्योंकि अन्यथा यह केवल अर्थहीन "MyNamespace दिखाएगा। MyClass "सभी पंक्तियों में)

मैं इस विधि में एक ऐसी ही बात करने के लिए कोशिश कर रहा हूँ।

public static string ConvertToCsv<T>(IEnumerable<T> items) 
{ 
    foreach (T item in items) 
    { 
    if(item is not a native/.NET class) // <-- How do you do this? 
     continue; 
    else // If it is a string/int/bool/DateTime or something meaningful 
    { 
     ... 
    } 
    } 
} 
+0

संभव डुप्लिकेट [निर्धारित करने के लिए कैसे एक DLL एक प्रबंधित विधानसभा या निवासी है कि क्या (एक देशी dll लोड को रोकने के)?] (Http://stackoverflow.com/questions/367761/how-to-determine कि क्या एक dll-है-एक कामयाब-विधानसभा या देशी-रोकने लोडिंग) - उच्चतम स्कोरिंग जवाब –

+0

धन्यवाद जेरेमी जाँच लेकिन मैं फ़ाइलों या DLL – Aximili

उत्तर

11
नहीं प्रदर्शन के बारे में

यकीन है, लेकिन आप पाशन

public static string ConvertToCsv<T>(IEnumerable<T> items) 
{ 
    foreach (T item in items.Where(i => i.GetType().Namespace.StartsWith("System"))) 
    { 

    } 
} 

संपादित पहले

if(item.GetType().Namespace.StartsWith("System")) 
{ 
    // do stuff 
} 

या फिल्टर की तर्ज पर somthing इस्तेमाल कर सकते हैं: एक त्वरित परीक्षण विधि से ऊपर के बाद कुछ त्रुटियां हैं, यदि आपकी ऑब्जेक्ट शून्य है (MyViewModel?) इसे इस चेक में उठाया जाएगा (System.Nullable<MyViewModel>)।

तो शायद आप इस्तेमाल कर सकते हैं:

public static string ConvertToCsv<T>(IEnumerable<T> items) 
{ 
    foreach (T item in items.Where(i => i.GetType().Module.ScopeName.Equals("CommonLanguageRuntimeLibrary"))) 
    { 

    } 
} 

एक और संपादित करें: पिछले विधि भी साथ कुछ मुद्दे प्रतीत हो रहा है, लेकिन नीचे यह एक अब तक का सबसे तेज और सबसे विश्वसनीय है, हम बस सिस्टम की एक सूची बनाएं। असेंबली से ऑब्जेक्ट्स, और जांचें कि क्या आपकी वस्तु ऑब्जेक्ट उस सूची में है या नहीं।

private List<Type> _systemTypes; 
public List<Type> SystemTypes 
{ 
    get 
    { 
     if (_systemTypes == null) 
     { 
      _systemTypes = Assembly.GetExecutingAssembly().GetType().Module.Assembly.GetExportedTypes().ToList(); 
     } 
     return _systemTypes; 
    } 
} 

public static string ConvertToCsv<T>(IEnumerable<T> items) 
{ 
    foreach (T item in items.Where(i => SystemTypes.Contains(i.GetType()))) 
    { 
     // is system type 
    } 
} 
+1

के बारे में बात नहीं कर रहा आपका उत्तरार्द्ध imo अधिक सुरुचिपूर्ण है –

+0

क्यों केवल नामस्थानों को स्टोर न करें? यह और भी तेज हो सकता है। हालांकि महान नमूना। – Edgar

+0

'विधानसभा के बजाय टाइपोफ (असेंबली) '। गेटएक्सिंगिंगएस्परब्स()। गेट टाइप()। मॉड्यूल' अधिक सुरुचिपूर्ण लगता है और वही करता है। पूर्ण लाइन '_systemTypes = typeof (विधानसभा) .Assembly.GetExportedTypes()) होगा ToList (;।' की तुलना में यह अधिक स्पष्ट है कि जो प्रकार यहां लक्षित करने के लिए प्रयोग किया जाता है और अधिक। Mscorlib के अलावा अन्य असेंबली में peeking के लिए आसानी से इस्तेमाल किया जा सकता है। –

0

आप एक पूर्वनिर्धारित हैश तालिका या शब्दकोश में उसे ढूंढने की होता है ... कहते हैं सभी विधानसभाओं कि .नेट फ्रेमवर्क एसडीके का हिस्सा हैं की गणना और एक शब्दकोश में पूरी तरह से योग्य नाम भंडारण के द्वारा।

0

मैं जानता हूँ कि यह पुराना है, लेकिन मुझे लगता है कि आप विधि के लिए देख रहे हैं।

Type type = result.GetType(); 
PropertyInfo[] properties = type.GetProperties(); 
foreach (PropertyInfo property in properties) 
{ 
    string prs = property.GetMethod.ToString(); 
    if(!prs.StartsWith("System")) 
    { 
     //IS CLass 
    } else { 
     Console.WriteLine(property.Name + ":::" + property.Value); 
    } 
} 
की

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

  • कोई संबंधित समस्या नहीं^_^