Yul*_*ian 5 c# generics inheritance constructor abstract
我读了一些与我相似的问题的答案,但找不到我的理由的好解释.请纠正我,如果我错了:)
我有三个类 - 一个名为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;
}
Run Code Online (Sandbox Code Playgroud)
我有一个泛型类,它使用派生自基类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;
}
Run Code Online (Sandbox Code Playgroud)
如果我决定创建一个Email类的新实例:
Email<DeliveryEmailData> email = new Email<DeliveryEmailData>(someDataTableObject);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
'DeliveryEmailData' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T'
Run Code Online (Sandbox Code Playgroud)
当我向基类和派生类添加无参数构造函数时,错误不再显示.问题是我不需要无参数构造函数,而是需要一个接收DataTable对象的构造函数.
那么,有谁知道这有什么问题?
Ham*_*yan 19
您已经制约了T作为T : new()这意味着它必须是非抽象的,即你必须能够创建类型的实例T,它必须有参数的构造函数.问题不在于
public Email(DataTable emailDataTable){}
Run Code Online (Sandbox Code Playgroud)
收到DataTable但是在...
public EmailData(DataRow emailDataRow){}
Run Code Online (Sandbox Code Playgroud)
您可以删除约束new()来解决您的问题.