2011-10-18 18 views
10

यहाँ के उपवर्ग होना चाहिए कि मैं क्या, क्या करने के लिए भी यकीन नहीं यदि संभव हो तो कोशिश कर रहा हूँ है ..निर्दिष्ट करें जेनरिक वर्ग जहां टी अन्य प्रकार

मैं BaseViewModel<T> बना रहा हूं और मैं इसे Entity से विरासत में मिली प्रकार स्वीकार करना चाहते हैं

public abstract class BaseViewModel<T> : NotificationObject, INavigationAware 
{ 

public T MyEntity; 

public SomeMethod() 
{ 
MyEntity.SomeEntityProperty = SomeValue; 
} 

} 

तो, मैं कहना है कि मेरी TEntity से विरासत में मिली चाहते हैं और इसलिए मुझे पता है कि यह SomeEntityProperty होगा:

इस कोड पर विचार करें।

क्या यह संभव है?

उत्तर

18

Salvatore के जवाब पूरी तरह से सही है, तो मैं सिर्फ अवधारणा थोड़ा बेहतर वर्णन करने के लिए करना चाहता था।

आपको "सामान्य प्रकार की बाधा" की आवश्यकता है; यह निर्दिष्ट करने के लिए कि टी के रूप में उपयोग किया जाने वाला प्रकार कुछ व्यवहारों (जैसे ऑब्जेक्ट से प्राप्त वस्तु या इंटरफ़ेस से व्युत्पन्न) से अवगत होना चाहिए, इस प्रकार आगे बढ़ने के बिना उस वस्तु के साथ आपको क्या करने की अनुमति है (जिसे आम तौर पर टालना है) जेनेरिक में)।

Salvatore के जवाब पता चलता है, GTCS "कहाँ" कीवर्ड का उपयोग परिभाषित कर रहे हैं:

public abstract class BaseViewModel<T> : 
    NotificationObject, 
    INavigationAware 

    where T : Entity; 
{ 
    ... 

यह मूलतः जीटीसी कहा गया है कि किसी भी टी (हालांकि दूर से) प्राप्त करना चाहिए इकाई से। यह आपको टी का इलाज करने की अनुमति देता है जैसे कि यह एक इकाई थी (नए टीएस के तत्काल के अलावा, जिसके लिए अतिरिक्त जीटीसी की आवश्यकता होती है), इस पर ध्यान दिए बिना कि वास्तविक जेनेरिक पैरामीटर प्रकार कितना कम या कम व्युत्पन्न है। आप एंटिटी पर दिखाई देने वाली किसी भी विधि को कॉल कर सकते हैं और किसी फ़ील्ड या प्रॉपर्टी को प्राप्त/सेट कर सकते हैं।

तुम भी है कि निर्दिष्ट कर सकते हैं:

  • प्रकार एक वर्ग (where T:class) होना चाहिए, या वैकल्पिक रूप से एक ValueType (where T:struct) होना चाहिए। यह या तो टी को उदाहरण के लिए टी आवृत्ति की तुलना और असाइनमेंट को रोकता है या रोकता है, जो नल-कोलेसिंग ऑपरेटर ?? के उपयोग को अनुमति देता है या रोकता है।
  • इस प्रकार के किसी विशेष हस्ताक्षर का निर्माता होना चाहिए (where T:new(), where T:new(int,float))। यह new कीवर्ड का उपयोग करके टीएस की तत्कालताओं को संकलित करने के लिए अनुमति देता है, जो कि टीएस के रूप में उपयोग किए जाने वाले सभी प्रकारों के अपेक्षित हस्ताक्षर के साथ एक निर्माता होता है।
11
public abstract class BaseViewModel<T> : 
    NotificationObject, 
    INavigationAware 

    where T : Entity 
{ 

    public T MyEntity; 

    public SomeMethod() 
    { 
     MyEntity.SomeEntityProperty = SomeValue; 
    } 

} 
5

बस where कीवर्ड का उपयोग करें:

public abstract class BaseViewModel<T> : NotificationObject, INavigationAware 
    where T:Entity 
{ 
... 
4

where बाधा उपयोग करके देखें:

public abstract class BaseViewModel<T> : NotificationObject, INavigationAware 
    where T : Entity 
{ 
    public T MyEntity; 

    public SomeMethod() 
    { 
     MyEntity.SomeEntityProperty = SomeValue; 
    } 
} 
संबंधित मुद्दे