在使用预定义类型调用构造函数时动态设置Type

时间:2016-11-24 18:31:00

标签: c# asp.net

我目前正在努力创建一个公共属性,但是在调用构造函数时定义了类型。

这是我现在的代码:

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()方法,它将使用StringWriterHtmlTextWriter对其进行解析,以将其作为HTML字符串。

我使用的是ASP.NET(而不是MVC),所以我选择的是性能问题吗?如果我选择object类型,我仍然可以访问switch内每个对象上的方法吗?

我想在这个类上定义它将创建的元素类型的new,所以我可以使用所选类的一些方法来设置。例如,如果我选择HtmlInputRadioButton我可以使用.Checked但我将在其他类中使用此元素,以根据您创建的元素设置属性。我明白了吗?

一种可能的解决方案是使用每种类型创建变量,但使用属性来查看哪一个不为null并获取该属性,但这不是一个优雅的解决方案。

其他解决方案是使用where T : HtmlControls, new()使用泛型,但我希望用户不知道,我希望他只能写new(Types.WHICH ONE TO USE)

全部谢谢!!!

2 个答案:

答案 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 ( ...)
...