2014-04-06 89 views
5

我閱讀了一些類似的問題的答案,但找不到我的案例很好的解釋。請糾正我,如果我錯了:)必須是具有公共無參數構造函數的非抽象類型

我有三個類 - 一個基本的抽象類,稱爲EmailData,和兩個其他類從基類派生。我沒有包括其中一個繼承類和大多數其他類的成員,以使這個例子更加明顯。

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' 

當添加一個參數構造在基座和派生類兩者,錯誤不再顯示了。問題是我不需要一個無參數的構造函數,而是一個接收DataTable對象的構造函數。

因此,沒有人知道什麼是錯的呢?

+3

這是因爲通用約束'where T:new()'。只要把它留下。 –

回答

19

您已將T限制爲T : new()這意味着它必須是非抽象的,即您必須能夠創建T類型的實例並且它必須具有無參數構造函數。 的問題不是在

public Email(DataTable emailDataTable){} 

接收DataTable

public EmailData(DataRow emailDataRow){} 

你可以刪除約束new()解決您的問題。

+0

自2007年以來我一直在使用C#,我發誓每週都會發現一個新功能。感謝本週的功能。 – user1454265

相關問題