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;
}
我的任务是以编程方式创建多个控件。它是 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;
}