我目前正在努力创建一个公共属性,但是在调用构造函数时定义了类型。
这是我现在的代码:
public class clsHtml: IDisposable
{
public enum Types { Section, Input, File, Radio, Checkbox, Select };
public TYPE HERE element;
public clsHtml(Types type)
{
CreateElement(type);
}
private void CreateElement(Types type)
{
switch(type)
{
case Types.Input:
element = new HtmlInputText();
break;
case Types.File:
element = new HtmlInputFile();
break;
case Types.Radio:
element = new HtmlInputRadioButton();
break;
case Types.Checkbox:
element = new HtmlInputCheckBox();
break;
case Types.Select:
element = new HtmlSelect();
break;
}
}
public override string ToString()
{
System.IO.StringWriter writer = new System.IO.StringWriter();
HtmlTextWriter html = new HtmlTextWriter(writer);
element.RenderControl(html);
return writer.ToString();
}
}
TYPE HERE
的位置,我应该使用dynamic
还是object
还是什么?我将从外部(公共)访问它,我只有一个简单的ToString()
方法,它将使用StringWriter
和HtmlTextWriter
对其进行解析,以将其作为HTML字符串。
我使用的是ASP.NET(而不是MVC),所以我选择的是性能问题吗?如果我选择object
类型,我仍然可以访问switch
内每个对象上的方法吗?
我想在这个类上定义它将创建的元素类型的new
,所以我可以使用所选类的一些方法来设置。例如,如果我选择HtmlInputRadioButton
我可以使用.Checked
但我将在其他类中使用此元素,以根据您创建的元素设置属性。我明白了吗?
一种可能的解决方案是使用每种类型创建变量,但使用属性来查看哪一个不为null并获取该属性,但这不是一个优雅的解决方案。
其他解决方案是使用where T : HtmlControls, new()
使用泛型,但我希望用户不知道,我希望他只能写new(Types.WHICH ONE TO USE)
。
全部谢谢!!!
答案 0 :(得分:4)
public class clsHtml<T>
where T : HtmlControl, new()
{
public T element;
public clsHtml()
{
element = new T();
}
public override string ToString()
{
System.IO.StringWriter writer = new System.IO.StringWriter();
HtmlTextWriter html = new HtmlTextWriter(writer);
element.RenderControl(html);
return writer.ToString();
}
}
这个怎么样?
答案 1 :(得分:3)
public enum Types { Section, Input, File, Radio, Checkbox, Select };
// Why did you decide it to be IDisposable? What are you going to dispose?
public class clsHtml: IDisposable
{
public HtmlControl element { get; private set; }
public clsHtml(Types type)
{
this.CreateElement(type);
}
private void CreateElement(Types type)
{
switch(type)
{
case Types.Input:
this.element = new HtmlInputText();
break;
case Types.File:
this.element = new HtmlInputFile();
break;
case Types.Radio:
this.element = new HtmlInputRadioButton();
break;
case Types.Checkbox:
this.element = new HtmlInputCheckBox();
break;
case Types.Select:
this.element = new HtmlSelect();
break;
default:
throw new NotImplementedException(type.ToString() + " not yet supported!");
}
}
public override string ToString()
{
System.IO.StringWriter writer = new System.IO.StringWriter();
HtmlTextWriter html = new HtmlTextWriter(writer);
this.element.RenderControl(html);
return writer.ToString();
}
}
var clsHtml = new clsHtml(Types.Input);
// the following part sucks, but you don't want to use generics
if (clsHtml.element is HtmlInputText)
{
HtmlInputText elementAsHtmlInputText = clsHtml.element as HtmlInputText;
}
else if ( ...)
...