首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重构:如何使用未知类型重构?

重构:如何使用未知类型重构?
EN

Stack Overflow用户
提问于 2010-03-02 08:29:06
回答 3查看 229关注 0票数 0

我不知道如何使用"T“,我从来没有很好地理解它,但我相信答案将驻留在它周围的任何东西.

我有一个巨大的开关,它所做的就是将一个属性应用于一个对象,并将控件添加到一个集合中,比如提取>应用属性>添加,如下:

1开关

代码语言:javascript
复制
foreach (AdwizaControl control in form.AdwizaControls)
{
    Panel panel = new Panel();
    int x = 0, y = 0;
    switch (control.Type)
    {

        case ControlType.CheckBox:
            AdwizaCheckBox checkbox = (AdwizaCheckBox)control.AdwizaWebControl;
            x = checkbox.X;
            y = checkbox.Y;
            panel.Controls.Add(checkbox);
            break;
        case ControlType.Bevel:
            AdwizaBevel bevel = (AdwizaBevel)control.AdwizaWebControl;
            bevel.Width = bevel.W;
            bevel.Height = bevel.H;
            panel.Controls.Add(bevel);
            break;

X和checkbox.Y是定义XML的属性,在这里,我们将控件设置为该大小

..。

第二开关(通过RadPageView (Telerik组件)中的控件循环)

代码语言:javascript
复制
foreach (RadPageView pageView in multiPage.PageViews)
{
    int controlCount = pageView.Controls.Count;

    for (int i = 0; i < controlCount; i++)
    {
        if (pageView.Controls[i].GetType() == typeof(AdwizaControl))
        {
            switch (((AdwizaControl)pageView.Controls[i]).Type)
            {

..。

代码语言:javascript
复制
case ControlType.Grid:
    AdwizaGrid pageViewGrid = (AdwizaGrid)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
    pageViewGrid.Attributes.Add(
        "style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewGrid.Y + increaseY, pageViewGrid.X + increaseX));
    pageView.Controls.Add(pageViewGrid);
    break;
case ControlType.Hyperlink:
    AdwizaHyperlink pageViewHyperlink = (AdwizaHyperlink)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
    pageViewHyperlink.Attributes.Add(
        "style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewHyperlink.Y + increaseY, pageViewHyperlink.X + increaseX));
    pageView.Controls.Add(pageViewHyperlink);
    break;
case ControlType.ImageBox:
    AdwizaImageBox pageViewImageBox = (AdwizaImageBox)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
    pageViewImageBox.Attributes.Add(
        "style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewImageBox.Y + increaseY, pageViewImageBox.X + increaseX));
    pageView.Controls.Add(pageViewImageBox);
    break;
case ControlType.Label:
    AdwizaLabel pageViewlabel = (AdwizaLabel)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
    pageViewlabel.Attributes.Add(
        "style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewlabel.Y + increaseY, pageViewlabel.X + increaseX));
    pageView.Controls.Add(pageViewlabel);
    break;
case ControlType.Slavebox:
    AdwizaSlavebox pageViewSlavebox = (AdwizaSlavebox)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
    pageViewSlavebox.Attributes.Add(
        "style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewSlavebox.Y + increaseY, pageViewSlavebox.X + increaseX));

    pageView.Controls.Add(pageViewSlavebox);
    break;
case ControlType.Repeatbox:
    AdwizaRepeatBox pageViewrepeatbox = (AdwizaRepeatBox)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
    pageViewrepeatbox.Attributes.Add(
        "style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewrepeatbox.Y + increaseY, pageViewrepeatbox.X + increaseX));
    pageView.Controls.Add(pageViewrepeatbox);
    break;

它更大,因为它必须覆盖所有我正在使用的物体.

我怎么能在一个简单的电话里做到这一点?类似于:

代码语言:javascript
复制
ApplyPositionAttribute(
    ((AdwizaControl)pageView.Controls[i]).AdwizaWebControl);

有办法简化这件事吗?

添加了开关语句

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-02 08:48:07

如果AdwizaRepeatBox、AdwizaRepeatBox、AdwizaSlavebox和其他类没有扩展具有属性属性的单个类,那么最好在反射命名空间中搜索答案或重写代码,以便扩展单个类

如果它们扩展了单个类,而不是您要查找的代码,那么应该如下所示:

代码语言:javascript
复制
private void ApplyPositionAttribute<T>(AdwizaWebControl webControl) where T : InheritedClass
{
    /* ... */

    T adwizalControl = (T)webControl;
    pageViewrepeatbox.Attributes.Add(
        "style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewrepeatbox.Y + increaseY, pageViewrepeatbox.X + increaseX));
    pageView.Controls.Add(pageViewrepeatbox);
}

编辑

如果所有adwizaControl都扩展具有属性属性的单个类,则使用此方法。如果扩展了X和Y属性,使用虚拟关键字覆盖基类声明

代码语言:javascript
复制
AdwizaWebControl webControl = ((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
webControl.Attributes.Add("style", string.Format("position:absolute;top:{0}px;left:{1}px;", webControl.Y + increaseY, webControl.X + increaseX));
pageView.Controls.Add(webControl);
票数 0
EN

Stack Overflow用户

发布于 2010-03-02 08:43:53

我理解所有类AdwizaGridAdwizaHyperlink等都有AdwizaControl作为公共基类。我还假设Attributes是在基类中定义的。在这种情况下,您可以删除大部分复制,如下所示:

代码语言:javascript
复制
AdwizaControl control;

case ControlType.Grid:
    control = ((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
    break;
case ControlType.Hyperlink:
    control = ((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
    break;
...

然后在案件之后:

代码语言:javascript
复制
control.Attributes.Add(
        "style", string.Format("position:absolute;top:{0}px;left:{1}px;",
        control.Y + increaseY, control.X + increaseX));
pageView.Controls.Add(control);

在此之后,您可以用某种从控件类型到属性的映射来替换大开关(我不熟悉C#,所以我无法给出确切的提示,但在C++中,您可以使用函子或指向成员的指针)。

票数 0
EN

Stack Overflow用户

发布于 2010-03-02 09:00:26

在这种情况下,您不必使用泛型。如果您的所有控件都继承自AdvizaWebControl,您只需编写如下内容:

代码语言:javascript
复制
AdwizaWebControl webControl = ((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
webControl.Attributes.Add("style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewGrid.Y + increaseY, pageViewGrid.X + increaseX));
pageView.Controls.Add(webControl);

但是,如果您的类不从AdwizaWebControl继承,那么泛型不会有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2361721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档