ASP.NET c#: "Cannot Create Instance of the abstract Class..." 那怎么办?

ASP.NET c#: "Cannot Create Instance of the abstract Class..." Then how?

我的任务是以编程方式创建多个控件。它是 DevExpress,但是是一个通用问题。 ASPxTextBox、ASPxComboBox 和 ASPxDateEdit 具有相同的基础 class - ASPxTextBase。我想用 ASPxTextBase 中的许多相同设置声明控件,然后稍后添加不同编辑器的特定选项。喜欢:

MakeControl(String Type, String Name, Int Length...)
{
    ASPxTextBase tbBase = new ASPxTextBase();
   tbBase.Name = Name;
   tbBase.Length = Length;

   ...
   if (Type == "COMBO")
        ... Cast tbBase to Combo Box
   if (Type = "DATE")
        ...  Case tbBase to DateEdit

但是 ASPxTextBase 给出了错误 "Cannot Create Instance of the abstract Class..."。我如何分享这个方法?

您可以修改它,这样您实际上就可以创建正确 class 的实例,我想还有另一种方法可以做到这一点,但以下方法应该可行:

     ASPxTextBase MakeControl(String Type, String Name, int Length)
    {
        ASPxTextBase tbBase = null;

        switch (Type)
        {
            case "COMBO":
                tbBase = new ComboBox()
                {
                    Items = new List<string>()
                };
                break;

            case "DATE":
                tbBase = new DateEdit()
                {
                    Date = DateTime.Now
                };
                break;

            default:
                throw new ArgumentException(nameof(Type));
        }

        tbBase.Name = Name;
        tbBase.Length = Length;

        return tbBase;

    }

我为 Combo 或 Date 类型可能具有的内容制作了一些假属性。

您不能创建摘要class。您可以声明一个并继承一个,但不能创建它。您需要先创建具体 class,然后访问基础 class:

上的公共属性
MakeControl(String Type, String Name, Int Length...)
{
    ASPxTextBase tbBase = null;

   if (Type == "COMBO")
   {
        tbBase = new ASPxComboBox();
   }
   else if (Type = "DATE")
   {
        tbBase = new ASPxDateEdit();
   }

   tbBase.Name = Name;
   tbBase.Length = Length;

   ...
}

注意:我不知道 DevExpress class 名称,所以我在代码中使用了虚拟名称。

只要该类型具有无参数构造函数,您就可以在此处使用泛型方法。像这样将您希望创建的类型作为通用参数传递:

var dateControl = MakeControl<ASPxDateEdit>(“dateEdit1”, 50);
dateControl.Date = DateTime.Now;

类似的东西;我在我的 phone 上,所以没有检查或测试语法,但你明白了。

T MakeControl<T>(String name, Int length) where T : ASPxTextBase, new()
{
    var control = new T();

    control.Name = name;
    control.Length = length;

    return control;
}