2010-04-06 15 views
25

संभव डुप्लिकेट:
Making a generic propertyजेनेरिक संपत्ति

मैं काफी है कि कैसे करना है, लेकिन मुझे क्या करना चाहते हैं यह एक विशेष प्रकार बनाने के लिए है यकीन नहीं है संपत्ति जो get और set पर विशिष्ट कार्यों को निष्पादित करेगी, और सामान्य प्रकार पर परिभाषित की जाएगी। उदाहरण के लिए, जब इस लेखन:

MyProp<String> name; 

एक पूर्व निर्धारित get और set स्ट्रिंग मान पर प्रदर्शन किया जाएगा।

यह कैसे किया जा सकता है?

धन्यवाद!

+3

मुझे यकीन नहीं है कि मैं सवाल समझता हूं। – Amy

+1

आपको इसके लिए जेनिक्स क्यों चाहिए? क्या आप वास्तव में क्या करना चाहते हैं इसका एक उदाहरण पोस्ट कर सकते हैं, और आप इसे विभिन्न प्रकारों पर क्यों करना चाहते हैं? – Dave

+0

मुझे भी समझ में नहीं आता है। 'मायप्रॉप नाम {get {return DoCustomGet() प्राप्त करें; } {सेट {DoCustomSet (मान); }} काम नहीं करते? – Jaxidian

उत्तर

61

आप इस प्रकार का सामान्य वर्ग बना सकते हैं:

public class MyProp<T> 
{ 
    private T _value; 

    public T Value 
    { 
     get 
     { 
      // insert desired logic here 
      return _value; 
     } 
     set 
     { 
      // insert desired logic here 
      _value = value; 
     } 
    } 

    public static implicit operator T(MyProp<T> value) 
    { 
     return value.Value; 
    } 

    public static implicit operator MyProp<T>(T value) 
    { 
     return new MyProp<T> { Value = value }; 
    } 
} 

...तो इसलिए की तरह एक कक्षा में इसका इस्तेमाल करते हैं:

class SomeClass 
{ 
    public MyProp<int> SomeProperty { get; set; } 
} 

निहित ऑपरेटरों मतलब है कि आप स्पष्ट रूप से सेट या MyProp की Value संपत्ति प्राप्त करने की आवश्यकता नहीं है, लेकिन एक और अधिक "प्राकृतिक" में मूल्य का उपयोग करने के कोड लिख सकते हैं रास्ता:

SomeClass instance = new SomeClass(); 
instance.SomeProperty = 32; 
int someInt = instance.SomeProperty; 
+0

मुझे लगता है कि यह एक विशेष प्रकार की संपत्ति बनाने के लिए अनुपलब्ध है जो प्राप्त करने और सेट पर विशिष्ट कार्य करेगा .. "लेकिन चूंकि यह प्रश्न वास्तव में अस्पष्ट है, इसलिए मैं गलत हो सकता हूं। –

+0

@ बेंजामिन: हाँ, सवाल थोड़ा अस्पष्ट है, लेकिन वह जगह है जहां 'वांछित तर्क यहां डालें' टिप्पणियां मेरे कोड नमूने में तस्वीर में आती हैं। आप कुछ तर्क डाल सकते हैं जो गेटटर या सेटर का आह्वान होने पर किया जाएगा, भले ही यह किस संपत्ति के लिए किया जाता है। –

+0

वाह, मैं पूरी तस्वीर देखने के लिए पूरी तरह से चूक गया। मैं वास्तव में निहित ऑपरेटरों का कोई मित्र नहीं हूं, लेकिन - मुझे लगता है कि आपने सवाल का जवाब ठीक किया है। +1। –

2

आपको माइप्रॉप नामक एक सामान्य श्रेणी बनाने की आवश्यकता होगी। फिर, आपको निहित या स्पष्ट कास्ट ऑपरेटरों को जोड़ने की आवश्यकता होगी ताकि आप मान प्राप्त कर सकें और मान सेट कर सकें जैसे कि यह सामान्य प्रकार पैरामीटर में निर्दिष्ट प्रकार था। ये कास्ट ऑपरेटर आपको आवश्यक अतिरिक्त काम कर सकते हैं।

+0

काम नहीं करेगा, मुझे लगता है कि केवल कलाकारों के साथ ही, ऑपरेटर ऑपरेटर की आवश्यकता होगी जो ओवरलोड करने योग्य नहीं है ... –

+0

@Tim: कास्ट ऑपरेटर दोनों तरीकों से जाते हैं। एक MyProp पर एक स्ट्रिंग असाइन करते समय, यदि कोई अंतर्निहित कास्ट ऑपरेटर है, तो इसका उपयोग किया जाएगा। –

+0

हां लेकिन एक डेवलपर अभी भी माइप्रॉप वैल्यू के साथ संपत्ति को सेट किए बिना सेट करने में सक्षम होगा .... –

1

तुम बस संपत्ति सामान्य तरीके से एक सामान्य प्रकार का उपयोग कर की घोषणा:

public MyType<string> PropertyName { get; set; } 

आपको मिल में कुछ करना या स्थापित करने के लिए पूर्वनिर्धारित तरीकों कॉल करने के लिए चाहते हैं, संपत्ति गेटर/सेटर लागू उन तरीकों कॉल करने के लिए ।

+0

आप अनबाउंड जेनेरिक प्रकारों के साथ गुण भी घोषित कर सकते हैं, जो चीजों को और अधिक मजेदार बनाता है: सार्वजनिक MyType PropertyName {get; सेट; }। यदि आप गेटर/सेटर को लागू करते हैं, तो मान का प्रकार टी होगा और इसका उपयोग कैसे किया जाएगा इसके साथ अलग-अलग होगा। – dthorpe

3

आप इस तरह से संपत्ति वाक्यविन्यास को 'बदल नहीं सकते'।

class Foo 
{ 
    string MyProperty { get; set; } // auto-property with inaccessible backing field 
} 

और एक जेनेरिक वर्जन इस प्रकार दिखाई देगा: आप क्या कर सकते यह है

class Foo<T> 
{ 
    T MyProperty { get; set; } 
} 
2

ठीक है, मैं काट देंगे। आप इस तरह कुछ चाहते हैं: यदि आप इस तरह की "संपत्ति" घोषित करते हैं:

अद्यतन: अब मुझे पूरा यकीन है कि फ्रेडरिक मोर्क ने आपके प्रश्न का उत्तर दिया और समाधान दिया। मैं इस विचार से वास्तव में खुश नहीं हूं, लेकिन ऐसा लगता है कि मैं आपके प्रश्न से क्या समझ गया था।

public class PropertyFoo { 
    public MyProp<String> Name; 
} 

यह वास्तव में के रूप में

public class PropertyFoo { 
    public string Name { 
    get { /* do predefined stuff here */ } 
    set { /*other predefined stuff here */ } 
    } 
} 

सं संभव नहीं और नहीं एक संपत्ति समाप्त होता है,। अपने आईडीई में टेम्पलेट/स्निपेट समर्थन की तलाश करें।

+0

सबसे तार्किक निष्कर्ष +1। – leppie

1
public class MyProp<T> 
{ 
... 
} 

public class ClassThatUsesMyProp 
{ 
public MyProp<String> SomeProperty { get; set; } 
} 
संबंधित मुद्दे