必须是具有公共无参数构造函数的非抽象类型

时间:2014-04-06 11:20:49

标签: 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;
    }

我有一个泛型类,它使用派生自基类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对象。

那么,有人知道这有什么问题吗?

1 个答案:

答案 0 :(得分:19)

您已将T约束为T : new(),这意味着它必须是非抽象的,即您必须能够创建类型T的实例,并且它必须具有无参数构造函数。

中没有问题
public Email(DataTable emailDataTable){}

接收DataTable,但在

public EmailData(DataRow emailDataRow){}

您可以删除约束new()来解决问题。