2012-08-06 12 views
5

मैं निम्नलिखित सहायक विधि है:सामान्य प्रकार पैरामीटर के लिए कोई मुक्केबाजी या प्रकार पैरामीटर रूपांतरण

public T Map<F, T>(F value, T toValue) 
    where T : new() 
    where F : new() 
{ 
    if (typeof(T).BaseType.FullName == "MyNamespace.Request") 
    { 
     toValue = MyExtensions.CreateRequest<T>(); 
    } 
    else 
    { 
     toValue = new T(); 
    } 
} 

:

public static T CreateRequest<T>() 
    where T : Request, new() 
{ 
    T request = new T(); 
    // ... 
    // Assign default values, etc. 
    // ... 
    return request; 
} 

मैं एक सहायक में एक और तरीका के अंदर से इस विधि का उपयोग करना चाहते हैं लेकिन तब मैं त्रुटि मिलती है:,

The type 'T' cannot be used as type parameter 'T' in the generic type or method 'MyExtensions.CreateRequest()'. There is no boxing conversion or type parameter conversion from 'T' to 'MyNamespace.Request'.

वहाँ प्रकार "टी" कास्ट करने के लिए एक रास्ता है ताकि CreateRequest woul समस्याओं के बिना इसका उपयोग करें?

संपादित करें:

मैं जानता हूँ कि मैं दो बातें कर सकते हैं:

  • CreateRequest पर बाधाओं को ढीला या
  • मानचित्र में contraints कस।

लेकिन मैं पहले ऐसा नहीं कर सकता, क्योंकि CreateRequest I में अनुरोध वर्ग के उपयोगकर्ता गुण हैं, और मैं दूसरा नहीं कर सकता, क्योंकि मैं मानचित्र के साथ अन्य प्रकार (अनुरोध से प्राप्त नहीं होता) का उपयोग करता हूं समारोह।

+0

इसका मतलब है: "या तो या कोई नहीं" –

उत्तर

4

: Map करने की घोषणा बदलने का प्रयास करें।

public static T CreateRequest<T>() 
    where T : new() 
{ 
    if(!typeof(Request).IsAssignableFrom(typeof(T))) 
     throw new ArgumentException(); 

    var result = new T(); 
    Request request = (Request)(object)result; 
    // ... 
    // Assign default values, etc. 
    // ... 
    return result ; 
} 

यह दर्दनाक हो सकता है क्योंकि आप इस पैरामीटर के संकलन समय सत्यापन को खो देते हैं।

या यदि आप कहीं और CreateRequest विधि का उपयोग करना चाहते हैं तो केवल इस परिदृश्य के लिए गैर-जेनेरिक अधिभार बनाएं।

public static object CreateRequest(Type requestType) 
{ 
    if(!typeof(Request).IsAssignableFrom(requestType)) 
     throw new ArgumentException(); 

    var result = Activator.CreateInstance(requestType); 
    Request request = (Request)result; 
    // ... 
    // Assign default values, etc. 
    // ... 
    return result ; 
} 
+0

इस डबल-कास्ट की आवश्यकता क्यों है? '(अनुरोध) (ऑब्जेक्ट) परिणाम;' –

+0

'IsAssignableFrom' के साथ अच्छी पकड़! स्ट्रिंग-तुलना से बेहतर तरीका! –

+0

दोहरी कास्ट संकलक के लिए उसे बताने के लिए है कि आप जानते हैं कि आप क्या कर रहे हैं और आप इसके लिए ज़िम्मेदारी लेते हैं। इसके बिना यह काम नहीं करेगा और अगर उपरोक्त सुनिश्चित करता है कि यह काम करेगा। – Rafal

3

आपने घोषणा की है कि TCreateRequest विधि में है; दूसरी तरफ, Map विधि में आपके पास ऐसी बाधा नहीं है। इस परिदृश्य आप CreateRequest के जेनेरिक प्रतिबंध को ढीला करने की आवश्यकता होगी के लिए

public T Map<F, T>(F value, T toValue) 
where T : Request, new() 
where F : new() 
+0

समस्या मैं प्रकार, कि अनुरोध से विरासत में नहीं आता के साथ मानचित्र फ़ंक्शन का उपयोग है, इसलिए मैं इस contraint निर्धारित नहीं कर सकते। –

+0

फिर आप CreateRequest फ़ंक्शन से अनुरोध बाधा को हटाने का प्रयास कर सकते हैं। – daryal

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