下面代码的目的是传入一个控件对象(TextBox/button等),再设置其属性。那么应该如何转换对象,以便统一设置对象共同的属性?
public void DoIt(object obj)
{
//如何转换?为避免重复代码,不考虑此方式:((TextBox)obj).Height = new Unit(400);
obj.Height = new Unit(400);
}

解决方案 »

  1.   

    为什么参数是object ??而不是Control??public void DoIt(object obj) 

        Control control = obj as Control;
        if (control != null) control.Height = new Unit(400); 
    }
      

  2.   

    public void DoIt(ref Control c) 

       c.Height = 400;
    }
      

  3.   

    control只具备基本的一些属性,如果要设置DataSource等,就不行了,不知有更好的方法吗?
      

  4.   

    public void DoIt(object obj)
    {
    //如何转换?为避免重复代码,不考虑此方式:((TextBox)obj).Height = new Unit(400);
    obj.Height = new Unit(400);
    }
    ----------------------------------------------------看你上面的代码,反回类型为void,而参数是一个object,这种设计不合理,设计一个方法,就应该知道它的返回值类型,如果连设计者都不清楚它具体的返回类型,
    这个方法是无意义的。 你的出发点可能是想写一个通用的方法能够设定所有未知Control类型的属性,但参数是OBJECT,告诉人家这个方法接受任意类型的数据,而且没有返回值,这个不符合常理吧??比较好的方案是做一个接口或是抽像类,然后实现或继承这个接口或抽像类。public abstract class MyObject
    {
        public abstract Control SetMyControl(Control sourceControl);
    }
    public class TestObject : MyObject
    {
        public override Control SetMyControl(Control sourceControl)
        {
            if (Control is TextBox)  //你知道你的Control是什么类型
            {
               TextBox textBox = (TextBox)Control;
                //Your Code here
               return texBox
            }
            else if (Control is Repeater)
            {
               //Your Code here
               //return a repeater
            }
            else return null;
        }
    }public class SecondTestObject : MyObject
    {
        public override Control SetMyControl(Control sourceControl)
        {
            if (Control is CheckBox)  //我知道我的Control是什么类型
            {
                CheckBox checkBox = (CheckBox)Control;
                //Your Code here
                return checkBox;
            }
            else if (Control is DataList)
            {
               //Your Code here
               //return a DataList
            }
            else return null;
        }
    }
      

  5.   

    其实,想要实现的目标就是:传入一个控件,然后设置控件的多个属性(但不是control的基本属性)。
    如果每个属性都需要先将传入的对象转换成指定的控件类型,那么重复的代码量会比较大,
    现在的想法是要精简一下,避免在判断对象的类型时,重复设置相同的属性,如:if (obj is TextBox)
    {
    ((TextBox)obj).Height = new Unit(400); 
    ((TextBox)obj).Width = new Unit(400); 
    ((TextBox)obj).Text = "文字"; 
    //...其它多个属性
    }
    if (obj is Button)
    {
    ((Button)obj).Height = new Unit(400); 
    ((Button)obj).Width = new Unit(400); 
    ((Button)obj).Text = "文字"; 
    //...其它多个属性
    }是否可以优化一下代码?