2010-01-24 13 views
7

मुझे इस तरह एक अमूर्त वर्ग मिला है;वर्तमान प्रकार को स्थिर, सामान्य विधि में प्राप्त करना?

public abstract PropertyBase 
{ 
    public static System.Type GetMyType() 
    { 
     return !!!SOME MAGIC HERE!!! 
    } 
} 

मैं इसे उपवर्ग करना चाहते हैं, और जब मैं स्थिर GetMyType() कहते हैं, मैं उपवर्ग के प्रकार वापसी करना चाहते हैं। तो अगर मैं एक उप प्रकार घोषित करता हूं;

public class ConcreteProperty: PropertyBase {} 

फिर जब मैं फोन

var typeName = ConcreteProperty.GetMyType().Name; 

मैं उम्मीद 'TypeName' पर सेट हो करने के लिए "ConcreteProperty।" मुझे संदेह है कि ऐसा करने का कोई तरीका नहीं है, लेकिन मुझे कोई दिलचस्पी है अगर कोई भी इस जानकारी को पाने का तरीका जानता है।

(विशेष समस्या मैं हल करने के लिए कोशिश कर रहा हूँ WPF में निर्भरता गुणों के शब्दाडंबर है, मैं इस तरह कुछ करने के लिए सक्षम होने के लिए हमे खुशी

class NamedObject : DependencyObject 
{ 
    // declare a name property as a type, not an instance. 
    private class NameProperty : PropertyBase<string, NamedObject> { } 

    // call static methods on the class to read the property 
    public string Name 
    { 
     get { return NameProperty.Get(this); } 
     set { NameProperty.Set(this, value); } 
    } 
} 

और मैं लगभग एक है कार्यान्वयन, लेकिन मैं नहीं काफी जानकारी मैं अपने NameProperty कक्षा से बाहर की जरूरत प्राप्त कर सकते हैं)

+0

स्थिर होने का क्या कारण है? आभासी या सार के रूप में घोषित आपको समस्या होगी –

+0

क्यों स्थिति: यह एक अजीब कोण है, और एक सी # वास्तव में इसके लिए डिज़ाइन नहीं किया गया है। कभी-कभी आपके प्रकार में केवल एक मान हो सकता है। तो 'वर्ग स्टीव: व्यक्ति {}' एक प्रकार की घोषणा करता है, लेकिन चूंकि केवल एक ही संभावित मूल्य है, इसलिए 'स्टीव' वर्ग भी एक उदाहरण की पहचान करता है। 'स्टीव' प्रकार घोषित करने से सिंगलटन 'स्टीव' घोषित किया जाता है। डब्ल्यूपीएफ डीपी इस तरह हैं; वे यह तय नहीं कर सकते कि वे उदाहरण डेटा, मेटाडेटा या प्रकार हैं। मैं उन्हें सभी को एक कोड निर्माण में बदलने की कोशिश कर रहा हूं। यह सभी सट्टा एटीएम है, लेकिन मुझे इसके लिए अपने आप को आगे बढ़ाने में दिलचस्पी है। –

+0

यहां मुझे इसकी आवश्यकता क्यों है: बॉयलरप्लेट टाइपडिस्क्रिप्टर कोड के लिए आंशिक कक्षा उत्पन्न करना। गतिशील रूप से निर्मित संपत्ति नाम प्रकार पर परिभाषित गुणों के साथ संघर्ष नहीं कर सकते हैं, इसलिए मुझे चेक करने के लिए प्रकार के भीतर संपत्ति नामों की एक सूची चाहिए। यह अधिक बॉयलरप्लेट कोड है और इसलिए कोडेजन में चला जाता है। यह स्थैतिक के लिए भी एक आदर्श उम्मीदवार है, क्योंकि यह नहीं बदलता है।इसलिए मुझे एक स्थिर निर्माता के भीतर वर्तमान प्रकार की गुणों वाली एक सूची उत्पन्न करने की आवश्यकता है। खैर, नरक, अब मुझे टी 4 टेम्पलेट में जादू तारों का उपयोग करने की आवश्यकता है। – Will

उत्तर

6

आप आंशिक रूप से (प्राप्त कर सकते हैं विरासत गहरी) का उपयोग जेनरिक की 1-स्तर:।

class PropertyBase<T> 
{ 
    public static Type GetMyType() { return typeof (T); } 
} 

// the base class is actually a generic specialized by the derived class type 
class ConcreteProperty : PropertyBase<ConcreteProperty> { /* more code here */ } 

// t == typeof(ConcreteProperty) 
var t = ConcreteProperty.GetMyType(); 
+0

ध्यान दें कि यह केवल एक स्तर पर काम करता है, यदि आप कंक्रीटप्रोपर्टी से उतरते हैं, तो यह अभी भी GetMyType से कंक्रीटप्रोपर्टी वापस कर देगा। –

+0

यह सच है। और इस दृष्टिकोण की सीमाओं में से एक। लेकिन यह अभी भी ओपी की निर्भरता संपत्ति उदाहरण में मदद कर सकता है। – LBushkin

+0

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

4

उपclassing बिट काम नहीं करेगा, क्योंकि एक स्थिर विधि एक प्रकार से बंधी है। यह एक एक प्रकार की विधि है, उदाहरण की विधि नहीं है। उप प्रकार में आधार प्रकार की स्थैतिक विधियां नहीं होती हैं, क्योंकि वे अलग-अलग प्रकार होते हैं और स्थिर विधि बेस प्रकार से बंधी होती है। भले ही संकलक आपको व्युत्पन्न वर्ग के माध्यम से बेस क्लास की स्थैतिक विधि को कॉल करने की अनुमति दे, फिर भी यह मूल रूप से बेस क्लास से विधि को कॉल करेगा। यह सिर्फ वाक्यविन्यास चीनी है। इसी कारण से आप उप-वर्गों में स्थैतिक विधियों को "ओवरराइड" नहीं कर सकते क्योंकि इससे थोड़ा सा अर्थ नहीं होगा।

0

बस सोच रहा है कि ऐसा कुछ करने की आवश्यकता क्यों होगी? जबकि विधि बुला, तो आप बस इस रूप में अच्छी तरह से कर सकते हैं

var typeName = ConcreteProperty.GetMyType().Name; 

किसी भी तरह आप प्रकार पता ..

var typeName = typeof(ConcreteProperty).Name; 

बस मामले में आप ऐसा करने की जरूरत है, तो आप ओवरराइड करने के लिए "पीछा" का उपयोग कर सकते बाल वर्ग में आधार वर्ग के कार्यान्वयन।

public class ConcreteProperty : PropertyBase { 

     public new static Type GetMyType { 
      //provide a new implementation here 
     } 
    } 
+0

दुर्भाग्य से मेरे उदाहरण कोड में मैंने इसे आवश्यक समस्या को कम करने के लिए इसे सरल बना दिया है, और यह आपके द्वारा वर्णित तरीके से सुलभ होगा। हालांकि, मेरे समाधान की आवश्यकता है, हालांकि, संपत्तिबेस के किसी भी उप-वर्ग के लिए पूछने की क्षमता है, 'आपका वास्तविक प्रकार क्या है'। जिस तरह से, उदाहरण के लिए, 'this.GetType()' को कॉल करना हमेशा मूल प्रकार के बजाय वास्तविक प्रकार मिलता है। –

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