2009-07-24 13 views
22

मान लें कि मेरे पास Type है जिसे type कहा जाता है।निर्धारित करें कि कोई प्रकार स्थिर है

मैं निर्धारित करने के लिए अगर मैं (वास्तव में प्रत्येक प्रकार के लिए ऐसा किए बिना) मेरी प्रकार के साथ ऐसा कर सकते हैं:

Point point1 = new Point(); 

लेकिन अगर type:

तो type है System.Windows.Point तो मैं ऐसा कर सकता है है System.Environment तो यह उड़ नहीं होगा:

Environment environment1 = new Environment(); //wrong 

तो अगर मैं हर के माध्यम से पुनरावृत्ति कर रहा हूँ एक असेंबली में दृश्यमान प्रकार मैं उन सभी प्रकारों को कैसे छोड़ूं जो दूसरे की तरह एक उदाहरण बनाने में असफल हो जाएंगे? मैं प्रतिबिंब के लिए नया हूं, इसलिए मैं अभी तक शब्दावली के साथ इतना अच्छा नहीं हूं। उम्मीद है कि मैं यहां क्या करने की कोशिश कर रहा हूं वह बहुत स्पष्ट है।

उत्तर

53

static कक्षाएं आईएल स्तर पर abstract और sealed घोषित की गई हैं। तो, आप एक ही बार में (आपके उपयोग के मामले के लिए) दोनों abstract वर्गों और static वर्गों को संभालने के लिए IsAbstract संपत्ति देख सकते हैं।

हालांकि, abstract कक्षाएं एकमात्र प्रकार नहीं हैं जिन्हें आप तुरंत चालू नहीं कर सकते हैं। आपको इंटरफेस (without the CoClass attribute) जैसी चीजों की जांच करनी चाहिए और ऐसे प्रकार जिनके पास कॉलिंग कोड द्वारा कन्स्ट्रक्टर तक पहुंच योग्य नहीं है।

+3

जवाब के लिए धन्यवाद, यह मेरे लिए एक लंबे समय अपने दम पर इस साथ आने के लिए ले लिया होता। – Beaker

-3

यह एक तरह से एक सभा में सभी प्रकार की सभी सार्वजनिक contstuctors प्राप्त करने के लिए है।

var assembly = AppDomain.CurrentDomain.GetAssemblies()[0]; // first assembly for demo purposes 
var types = assembly.GetTypes(); 
foreach (var type in types) 
{ 
    var constructors = type.GetConstructors(); 
} 
6

आप इस तरह सार्वजनिक contructors लिए खोज सकते हैं,

या यदि आप केवल parameterless निर्माता में रुचि रखते आप

Type t = typeof(Environment); 
var c = t.GetConstructor(Type.EmptyTypes); 
if (c != null && c.IsPublic && !t.IsAbstract) 
{ 
    //You can create instance 
} 
+2

ध्यान दें कि एक 'सार' वर्ग में 'सार्वजनिक' कन्स्ट्रक्टर हो सकता है। आप अनिवार्य रूप से अपने 'if' कथन के शरीर में किसी वर्ग का उदाहरण नहीं बना सकते हैं। आपको 'सदस्य एक्सेस अपवाद' मिलेगा। –

+0

हाँ, आप सही हैं, मैंने पोस्ट संपादित किया है। –

10
type.IsAbstract && type.IsSealed 

उपयोग कर सकते हैं यह एक पर्याप्त जांच होगी सी # के लिए एक अमूर्त वर्ग को सी # में सील या स्थैतिक नहीं किया जा सकता है। हालांकि, अन्य भाषाओं से सीएलआर प्रकारों से निपटने के दौरान आपको सावधान रहना होगा।

1
Type t = typeof(System.GC); 
Console.WriteLine(t.Attributes); 
TypeAttributes attribForStaticClass = TypeAttributes.AutoLayout | TypeAttributes.AnsiClass | TypeAttributes.Class | 
TypeAttributes.Public | TypeAttributes.Abstract | TypeAttributes.Sealed | TypeAttributes.BeforeFieldInit; 
Console.WriteLine((t.Attributes == attribForStaticClass)); 

मुझे लगता है, यह काम करना चाहिए।

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