2011-01-13 17 views
6

मैं ईएफ 4 ऑब्जेक्ट्स को पीओसीओ में बदलने के लिए थोड़ा सा सहायक बना रहा हूं। (मैं जानता हूँ कि वहाँ AutoMapper, लेकिन मैं इस समय एसी # दुविधा हो रही है)सी # जेनिक्स नई() प्रकार के साथ बाधाएं: (नया (टी))

मैं यह कैसे काम कर सकते हैं (जहां पी: नई (ई) कानूनी नहीं है मुझे यकीन है कि बनाने के लिए चाहते हैं मैं सी # में एक सामान्य समारोह है कि एक नया ले जा सकते हैं कैसे कर सकते हैं एक निर्माता कि

(इसलिए परिवर्तन से निपटने के) मैं इस काम कर सकते हैं कैसे ई वर्ग लेता है के रूप में पी (POCO) वर्ग?

(प्रकार) बाधा?

public static List<P> ListConvert<E, P>(List<E> efList) where P: new(E) 
    { 
     List<P> pList = new List<P>(); 

     foreach (E item in efList) 
     { 
      P myItem = new P(item); 
      pList.Add(myItem); 
     } 
     return pList; 

उत्तर

8

ऐसी कोई बाधा नहीं है। क्या आप कर सकते हैं एक अतिरिक्त पैरामीटर है:

public static List<P> ListConvert<E, P>(List<E> efList, Func<E, P> func) 

इस तरह यह एक निर्माता होने के लिए आवश्यक नहीं है, लेकिन आप एक प्रतिनिधि में पारित कर सकते हैं जो कॉल निर्माता:

ListConvert(list, x => new Foo(x)) 

मेरे पास एक नीला-आकाश विचार है जो "static interfaces" नामक कन्स्ट्रक्टर बाधाओं को सक्षम करेगा - ये केवल सामान्य बाधाओं के लिए उपयोगी होंगे, लेकिन कुछ ऑपरेटर उपयोग के मामलों को भी सक्षम करेंगे।

+0

"स्थैतिक इंटरफेस" - आपको जेडिक्स को एफ # –

2

यह संभव नहीं है। new बाधा केवल आपको public parameterless constructor के माध्यम से ऑब्जेक्ट्स बनाने की अनुमति देती है।

2

P : new(E) जैसी कोई चीज नहीं है, लेकिन आप कॉलर एक प्रतिनिधि को पता है कि निर्माण करने के लिए कैसे एक P एक E दिया की आपूर्ति हो सकता है:

public static List<P> ListConvert<E, P>(List<E> efList, Func<E, P> converter) 
{ 
    List<P> pList = new List<P>(); 

    foreach (E item in efList) 
    { 
     P myItem = converter(item); 
     pList.Add(myItem); 
    } 
    return pList; 
} 

हालांकि, अगर आप यह कर रहे हैं, आप के रूप में हो सकता है अच्छी तरह से LINQ का उपयोग करें: efList.Select(e => new P(e)).ToList()

+0

में जहां पी: नई (ई) में एक ही समस्या है ... लेकिन मुझे लगता है कि कनवर्टर के साथ वहां होने की आवश्यकता नहीं है – Dani

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