C# 必须是具有公共无参数构造函数的非抽象类型
我读了一些类似问题的答案,但找不到一个很好的解释。如果我错了,请纠正我:) 我有三个类——一个称为EmailData的基本抽象类,以及从该基类派生的另外两个类。为了使示例更加明显,我没有包括一个继承类和其他类的大多数成员C# 必须是具有公共无参数构造函数的非抽象类型,c#,generics,inheritance,constructor,abstract,C#,Generics,Inheritance,Constructor,Abstract,我读了一些类似问题的答案,但找不到一个很好的解释。如果我错了,请纠正我:) 我有三个类——一个称为EmailData的基本抽象类,以及从该基类派生的另外两个类。为了使示例更加明显,我没有包括一个继承类和其他类的大多数成员 private abstract class EmailData { public EmailData(DataRow emailDataRow) { vehicleOwner = emailDataRow["ow
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;
}
当我向基类和派生类添加无参数构造函数时,错误不再显示。问题是我不需要无参数构造函数,而是需要一个接收DataTable对象的构造函数
那么,有人知道这有什么问题吗?您将
T
约束为T:new()
,这意味着它必须是非抽象的,即您必须能够创建T
类型的实例,并且它必须具有无参数构造函数。
问题不在这里
public Email(DataTable emailDataTable){}
它接收数据表
,但在
public EmailData(DataRow emailDataRow){}
您可以删除约束
new()
,以解决您的问题。这是因为通用约束where T:new()
。我从2007年就开始使用C#,我发誓我每周都会发现一个新功能。感谢本周的专题报道。
public Email(DataTable emailDataTable){}
public EmailData(DataRow emailDataRow){}