2010-08-04 24 views
10

के लिए कन्स्ट्रक्टर बाधा निर्दिष्ट करना मेरे पास ऑब्जेक्ट्स का एक संग्रह है जिसे मैं पैरामीटर के रूप में पास करता हूं ताकि अन्य प्रकार की वस्तुओं (एक के लिए एक) बना सकें। मैं इसे कई स्थानों पर कर रहा हूं (मूल रूप से डेटा ऑब्जेक्ट्स से व्यावसायिक ऑब्जेक्ट्स में कनवर्ट करना)। मैं इसे पूरा करने के लिए एक सामान्य विस्तार विधि लिखना चाहता हूं। लेकिन मैं अटक गया हूं क्योंकि मुझे नहीं पता कि मैं बाधा निर्दिष्ट कैसे कर सकता हूं कि व्यवसाय ऑब्जेक्ट में डेटा ऑब्जेक्ट को पैरामीटर के रूप में ले जाने वाला एक कन्स्ट्रक्टर है। मेरे फ़ंक्शन का कोड निम्नलिखित है:जेनेरिक पैरामीटर

public static IList<T> ConvertTo<A,T>(this IEnumerable<A> list) 
        where T : new(A)/*THIS IS PROBLEM PART*/ 
{ 
    var ret = new List<T>(); 

    foreach (var item in list) 
    { 
     ret.Add(new T(item)); 
    } 
    return ret; 
} 

उत्तर

13

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

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

+0

हाँ इंटरफ़ेस तरीका अच्छा है और मैं इसका उपयोग कर सकता हूं क्योंकि मैं बीओ उत्पन्न करने के लिए टी 4 टेम्पलेट का उपयोग कर रहा हूं इसलिए बहुत अधिक काम नहीं होगा। – TheVillageIdiot

3

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

public static IList<T> ConvertTo<A, T>(this IEnumerable<A> list, Func<A, T> constructionFunc) 
{ 
    return list.Select(constructionFunc).ToList(); 
} 

और इस तरह इसका इस्तेमाल:

var IList<T> converted = someSequence.ConvertTo(a => new T(a)); 
+0

फ़ंक्शन पैरामीटर का कोई उदाहरण? मुझे कक्षा टी में इसे कहां परिभाषित करना चाहिए? – TheVillageIdiot

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