2014-04-06 9 views
5

के साथ एक गैर अमूर्त प्रकार होना चाहिए, मैंने अपने कुछ समान प्रश्नों के उत्तर पढ़े लेकिन मेरे मामले में अच्छी व्याख्या नहीं मिली। कृपया, मुझे सही करें, अगर मैं गलत हूं :)सार्वजनिक पैरामीटर रहित कन्स्ट्रक्टर

मेरे पास तीन वर्ग हैं - एक आधार सारणी वर्ग, जिसे ईमेलडेटा कहा जाता है, और दो अन्य वर्ग जो बेस क्लास से प्राप्त होते हैं। मैंने उदाहरण प्राप्त करने के लिए विरासत वर्गों और अन्य वर्गों के अधिकांश सदस्यों में से एक को शामिल नहीं किया है।

private abstract class EmailData 
    { 
     public EmailData(DataRow emailDataRow) 
     { 
      vehicleOwner = emailDataRow["owner"].ToString(); 
     } 

     public string VehicleOwner { get { return vehicleOwner; } } 

     private string vehicleOwner; 
    } 

    private class DeliveryEmailData : EmailData 
    { 
     public DeliveryEmailData(DataRow deliveryData) 
      : base(deliveryData) 
     { 
      orderNumber = deliveryData["ordernumber"].ToString(); 
     } 

     public string OrderNumber { get { return orderNumber; } } 

     private string orderNumber; 
    } 

मैं एक सामान्य वर्ग, दो वर्गों है कि आधार वर्ग EmailData से निकाले जाते हैं में से एक का उपयोग करता है, और इस तरह दिखता है:

private class Email<T> where T : EmailData, new() 
    { 
     public Email(DataTable emailDataTable) 
     { 
      // Get the number of rows. 
      int rowsNumber = emailDataTable.Rows.Count; 

      emailsData = new T[rowsNumber]; 

      for (int i = 0; i < rowsNumber; i++) 
      { 
       // Store the appropriate data in the arrays. 
       emailsData[i] = (T)Activator.CreateInstance(typeof(T), emailDataTable.Rows[i]); 
      } 

      // Get the email of the recipient. 
      recipientEmail = emailDataTable.Rows[0]["delivery_email"].ToString(); 
     } 

     public T[] EmailsData { get { return emailsData; } } 
     public string RecipientEmail { get { return recipientEmail; } } 

     private T[] emailsData; 
     private string recipientEmail; 
    } 

मैं का एक नया उदाहरण बनाने का फैसला करते हैं ईमेल वर्ग:

Email<DeliveryEmailData> email = new Email<DeliveryEmailData>(someDataTableObject); 

मैं निम्नलिखित त्रुटि मिलती है:

'DeliveryEmailData' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' 

जब मैं आधार और व्युत्पन्न कक्षाओं दोनों के लिए पैरामीटर रहित कन्स्ट्रक्टर जोड़ता हूं, तो त्रुटि अब दिखाई नहीं देती है। समस्या यह है कि मुझे पैरामीटर रहित कन्स्ट्रक्टर की आवश्यकता नहीं है, लेकिन एक जिसे डेटाटेबल ऑब्जेक्ट प्राप्त होता है।

तो, क्या किसी को पता है कि इसमें क्या गलत है?

+3

यह सामान्य बाधा के कारण है जहां टी: नया() '। बस इसे छोड़ दो। –

उत्तर

19

आपने T को T : new() के रूप में बाध्य किया है जिसका अर्थ है कि यह गैर-सारणी होना चाहिए यानी आप T प्रकार का उदाहरण बनाने में सक्षम होना चाहिए और इसमें पैरामीटर रहित कन्स्ट्रक्टर होना चाहिए। समस्या नहीं

public Email(DataTable emailDataTable){} 

जो DataTable प्राप्त करता है लेकिन

public EmailData(DataRow emailDataRow){} 

में आप अपनी समस्या को हल करने के लिए बाधा new() निकाल सकते हैं।

+0

मैं 2007 से सी # का उपयोग कर रहा हूं और मैं कसम खाता हूं कि मैं हर हफ्ते एक नई सुविधा खोजता हूं। इस सप्ताह की सुविधा के लिए धन्यवाद। – user1454265

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

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