2010-08-29 9 views
13

को महत्व देता है अगर मैं कुछ प्रकार के उदाहरण के लिए है:सी # स्वचालित रूप से अन्य संपत्ति के आधार पर संपत्ति असाइन

public class SomeType //Generated by some codegen i won't to change that. 
{ 
    string C { get; set; }   
} 

public class AnotherType : SomeType 
{ 
    string A { get; set; } 
    string B { get; set; } 
} 

यह स्वचालित रूप से संपत्ति आवंटित सी संभव है? उदाहरण के लिए जब गुण ए और बी असाइन किए जाते हैं या जब मैं इस प्रकार को किसी अन्य प्रकार में कास्ट कर रहा हूं, या किसी और तरह?

मूल रूप से उदाहरण के लिए मैं कुछ तर्क निष्पादित करने के लिए स्वचालित रूप से कुछ बिंदु पर मान ए और बी के अनुसार संपत्ति सी आवंटित करने के लिए जब गुण को महत्व देता है ए और बी पॉपुलेटेड हो चाहता हूँ।

वहाँ कर रही बजाय मानक गुण का उपयोग कर के किसी भी अन्य तरीके है?

मैं सोच रहा था कि जादू के कुछ राजा को करना संभव है जब मैं कुछ प्रकार के लिए टाइप टाइप कर सकता हूं, लेकिन मैं निहित ऑपरेटर को लागू नहीं कर सकता हूं, जहां मैं इस रूपांतरण तर्क को "ए + बी से सी" में डाल सकता हूं क्योंकि संकलक नहीं करता है संबंधित प्रकारों के लिए निहित ऑपरेटर की अनुमति नहीं है।

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

उत्तर

15

यह स्वत: लागू किया गुणों का उपयोग करके भी संभव है। आप सेल्सियस के लिए एक मूल्य निर्दिष्ट बी के सेटर इस्तेमाल कर सकते हैं: ऐसा नहीं है कि मैं के बारे में पता

public class SomeType 
{ 
    public string A { get; set; } 
    public string C { get; set; } 

    private string _b; 
    public string B 
    { 
     get { return _b; } 
     set 
     { 
      // Set B to some new value 
      _b = value; 

      // Assign C 
      C = string.Format("B has been set to {0}", value); 
     } 
    } 
} 
+0

मैं:

public class MyClass { private string _a = "not set"; private string _b = "not set"; public string A { get { return _a; } set { _a = value; } } public string B { get { return _b; } set { _b = value; } } public string C { get { if (_a != "not set" && _b != "not set") return "not set"; else return "set"; } } } 

यहाँ एक संपत्ति तक पहुँचने का एक सरल उदाहरण है कि एक और संपत्ति पर निर्भर है है विरासत है I गुणों को संशोधित नहीं कर सकते – Kuncevic

+0

आप नामों या गुणों के प्रकारों को संशोधित नहीं कर रहे हैं, केवल उनके गेटटर और सेटर के कार्यान्वयन को जो आपकी विरासत को तोड़ना नहीं चाहिए। –

+0

@bigb: मैं आपकी टिप्पणियों के रूप में उलझन में हूं। क्या आप कह रहे हैं कि ए और बी, और संभवतः सी, आपके द्वारा विरासत में प्राप्त कक्षा के अंदर ऑटो गुण हैं और संशोधित नहीं कर सकते हैं? –

3

, तो आप इस प्रकार दलदल मानक गुणों का उपयोग करने के लिए (बैठाना आप केवल स्वत: संपत्तियों के बारे में जानते हैं)

होगा
public class SomeType 
{ 
    string _A; 
    string _B; 
    string _C; 

    public string A { get{return _A;} set{ _A = value; _C = _A + _B; } } 
    public string B { get{return _B;} set{ _B = value; _C = _A + _B; } 
    public string C { get{return _C}; } 
} 
+0

अद्यतन मैं मानक गुण नहीं कर सकते का उपयोग – Kuncevic

+3

@bigb, autoimplemented गुण ** ** मानक गुण हैं। वे सिंटैक्टिक चीनी हैं जो मानक गुणों में संकलित हो जाती हैं, इसलिए हाँ ** आप ** मानक गुणों का उपयोग कर सकते हैं, जो आप पहले से ही कर चुके हैं। –

+0

हाँ मुझे पता है कि, मैं अधिक जानकारी के – Kuncevic

4

आप सी स्थापित करने के लिए, या बस इसे पाने के सक्षम होने के लिए करना चाहते हैं? आप मान सेट करने में सक्षम होने की जरूरत नहीं है, तो मुझे लगता है कि आप इस हैं:

public class MyClass 
{ 
    private double[] MyArray = new double[5]; 

    public int NumElements 
    { 
     get 
     { 
      return MyArray.Length; 
     } 
    } 
} 
+0

धन्यवाद। मुझे केवल चर को "प्राप्त करने" की आवश्यकता है, और यह हमेशा मुझे समझ में आता है कि इस तरह के तर्क को वेरिएबल पर डालने के लिए जो स्वचालित रूप से बदला जा रहा है, क्योंकि सैद्धांतिक रूप से प्रभावित संपत्ति ('ए' या 'बी') शायद प्रभावित हो सकती है कई अन्य चर – AlbatrossCafe

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