我的任务是以编程方式创建多个控件。这是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给出错误“无法创建抽象类的实例...”。我该如何共享一种方法?
您可以对其进行修改,因此实际上您可以创建正确的类的实例,我想还有另一种方法可以做到,但以下方法应该可以工作:
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类型制作了一些假属性。
您无法创建抽象类。您可以声明一个并继承一个,但是不能创建它。您需要先创建具体的类,然后访问基类的通用属性:
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类的名称,所以我在代码中使用了虚拟名称。
我认为您可以在此处使用通用方法。像这样传递您希望创建的类型:
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;
}