ASP.NET c#:“无法创建抽象类的实例……”然后如何?

问题描述 投票:0回答:3

我的任务是以编程方式创建多个控件。这是DevExpress,但是一个普遍的问题。 ASPxTextBox,ASPxComboBox和ASPxDateEdit具有相同的基类-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给出错误“无法创建抽象类的实例...”。我该如何共享一种方法?

c# asp.net casting abstract
3个回答
0
投票

您可以对其进行修改,因此实际上您可以创建正确的类的实例,我想还有另一种方法可以做到,但以下方法应该可以工作:

     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类型制作了一些假属性。


0
投票

您无法创建抽象类。您可以声明一个并继承一个,但是不能创建它。您需要先创建具体的类,然后访问基类的通用属性:

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类的名称,所以我在代码中使用了虚拟名称。


0
投票

我认为您可以在此处使用通用方法。像这样传递您希望创建的类型:

var control = MakeControl<ASPxDateEdit>(“dateEdit1”, 50);

与此类似的东西;即时通讯在我的手机上,因此未检查或测试语法,但您明白了。

T MakeControl<T>(String Name, Int Length...) where T : ASPxTextBase, new()
{
    var control = new T();

    control.Name = Name;
    control.Length = Length;

    return control;
}
© www.soinside.com 2019 - 2024. All rights reserved.