2013-08-16 7 views
7

किसी समस्या का सामना ive के प्रकार के aguments टाइप है कि प्रारंभ करने में कैसे - ये मेरे वर्ग संरचना हैएक अंतरफलक अन्य इंटरफेस

public interface IModel{} 

public interface IGenericMapper<T> where T : IModel {...} 

public class ActualModel:IModel {...} 

public class ActualMapper: IGenericMapper<ActualModel> {...} 

नक्शाकार initialse मेरे वास्तविक कोड है:

IGenericMapper<IModel> mapper; 
mapper= new ActualMapper(); 

यह संकलित नहीं करता है। मुझे त्रुटि

स्पष्ट रूप से प्रकार 'ActualMapper' को 'IGenericMapper' में परिवर्तित नहीं कर सकता है। एक स्पष्ट रूपांतरण मौजूद है (यदि आप एक डाली याद कर रहे हैं?)

जब मैं

mapper= new ActualMapper() as IGenericMapper<IModel>; 

का उपयोग कर नक्शाकार ठीक से प्रारंभ नहीं होता है यह डाली है (इसे वापस शून्य के रूप में आता है)

मुझे क्या याद आ रहा है - ActualMapper() लागू IGeneric मैपर और इसके प्रकार के प्रत्यारोपण 'IModel' यह मैपर शुरू क्यों नहीं कर सकता है।

क्या यह संरचना करने का एक और तरीका है जिससे मुझे क्या चाहिए?

बहुत बहुत

नोट धन्यवाद समाधान लोगों का प्रस्ताव किया है मुझे अन्य संकलन त्रुटियों देता है के रूप में मानचित्रण इंटरफ़ेस निम्नलिखित सदस्य हैं

T GetModel(busO bBusinessObject); 
busO SetBusObject(T source, busO target); 

जाहिरा तौर पर आप नहीं कर सकते एक इनपुट पैरामीटर जब के रूप में सामान्य प्रकार है अपने "बाहर"

+4

क्या आप ILFFMapper <> की परिभाषा जोड़ सकते हैं? – LunicLynx

+0

'var ILFFMapper 'यह एक वाक्यविन्यास त्रुटि है,' var' कीवर्ड – Tommi

+0

हटाएं आपको एक कॉन्वेंटेंट प्रकार की आवश्यकता है। कोशिश IGenericMapper < out T> –

उत्तर

4

पर घोषित कर दिया आप को परिभाषित करने के लिए है

IGenericMapper<out T> 

अपने परिदृश्य का समर्थन करने के लिए, लेकिन यह अन्य सीमाओं को लागू करता है।

सीधे शब्दों में IGenericMapper<IModel>! = IGenericMapper<ActualModel> भी ActualModel : IModel अगर

सबसे स्थितियों में यह समझ में आता है एक आधार अंतरफलक है कि एक साधारण नहीं है है। उदाहरण के लिए IList<T> देखें, यह IList लागू करता है।

फिर आप इंटरफ़ेस सदस्यों को स्पष्ट रूप से कार्यान्वित करने के लिए कार्यान्वयन पर चयन कर सकते हैं। देखें List<T>.GetEnumerator() : IEnumerable

अनुमान के तहत जेनेरिक का उपयोग न करें कि आप हर जगह कास्टिंग को खत्म कर सकते हैं। मैंने कोशिश की है सी # बस इसके लिए आवश्यक विशेषताएं नहीं है।

मैं IGenericMapper<T> के लिए आधार इंटरफेस के रूप में एक IGenericMapper इंटरफ़ेस का सुझाव तो पर IGenericMapper और अंत में (और उस बिंदु पर आप पहले से ही प्रकार है) इसे वापस डाली विशिष्ट प्रकार के अपने सामान्य कोड करना होगा।

5

बहुत यकीन है कि आप जेनेरिक परिवर्तन के साथ यहां परवाह के दायरे में जा रहे हैं;

कोशिश यह:

public interface IModel{} 
public interface IGenericMapper< out T> where T : IModel{} 
public class ActualModel : IModel{} 
public class ActualMapper : IGenericMapper<ActualModel> {} 

और उसके बाद:

IGenericMapper<IModel> blah = new ActualMapper(); 
बाहर के साथ

'बाहर टी' सबसे अच्छा तुम कर सकते है:

IGenericMapper<ActualModel> blah = new ActualMapper(); 

यह एक खरगोश की मांद है , इसलिए सावधान रहें, खासकर यदि आप कभी भी दो मिश्रण करने का प्रयास करते हैं :)

http://msdn.microsoft.com/en-us/library/ee207183.aspx

[संपादित करें]

आप सामान्य T खिन्न करने में सक्षम होना चाहते हैं, तो यह out हो गया है और आप एक इनपुट के रूप में उपयोग नहीं कर सकते। हालांकि, आप इसे कार्यान्वित करने में कुछ वास्तविक समय पर ले जा सकते हैं; यानी यह देखने के लिए कि क्या आप इसे मॉडल प्रकार में डाल सकते हैं या नहीं।

interface IGenericMapper<out TModel, in TKeyOrIdent> 

TModel GetModel(TKeyOrIdent bBusinessObject); 
void SetModel(object model, TKeyOrIdent target); 
संबंधित मुद्दे