我閱讀了一些類似的問題的答案,但找不到我的案例很好的解釋。請糾正我,如果我錯了:)必須是具有公共無參數構造函數的非抽象類型
我有三個類 - 一個基本的抽象類,稱爲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對象的構造函數。
因此,沒有人知道什麼是錯的呢?
這是因爲通用約束'where T:new()'。只要把它留下。 –