我有这样一段代码 
    ......//省略
    if(cl is Lable)//如果foreach里的cl 是标签的话
    {
            aa();
    }
    if (cl is button)//如果是按钮的话 
    {
            aa();//由于方法aa 一样 我想优化简练代码
     }
   
   我想用方法的参数来写
   void 判断控件方法(控件类型 c_l)
    if(cl is c_l)
    {
          aa();
     }
要实现如上的效果 参数如何写呢 是 object 还是 class呢?

解决方案 »

  1.   

    参数当然是object了,如果你用的是4.0以上的版本,可以用dynamic类型作为参数。
      

  2.   

    if ((new Type[] { typeof(Button), typeof(Label) }).Contains(c1.GetType()))
        ...
      

  3.   

    类型应该是Type吧:http://msdn.microsoft.com/zh-cn/library/system.type(v=vs.80).aspx但是不觉得传类型不好,还是传实例好点(c1).参数可以使用控件的基类型System.Web.UI.WebControls.WebControl,假设你但是webform. 
      

  4.   

    不是可以这样写吗?if(c1 is Label || c1 is Button)
    {
        aa();
    }
      

  5.   

    object 可以,class 不可以
    void 判断控件方法(object c_l)
      

  6.   


     private bool compareType(Type targetType, object con)
            {
                if (con.GetType().Equals(targetType))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }Button btn1 = new Button();
                bool check1 = compareType(typeof(Button), btn1);不过这样子没有什么优势
      

  7.   

    private bool compareType(Type targetType, object con)
            {
                if (con.GetType().Equals(targetType))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
    这样写很蛋疼private bool compareType(Type targetType, object con)
    {
      return con.GetType().Equals(targetType);
    }
    就行了。
      

  8.   

    不知道具体使用场合,通用操作使用webControl非通用操作,采用查表法,直接把需要操作的类型用字典保存在一起,直接查表
      

  9.   

    呵呵,对象不是上帝就拿你的问题,非对象,反模式比对象、模式还容易解决。
    比如你的东西最简单的解法if(checkType(obj))一个checkType方法就ok,如果你说你不想修改。ok把checktype提到外面去。把类型判定放到配置项里,把操作丢到委托里都ok。这里千万别对象,一对象你就要去抽象工厂,就要去策略。这就过了,开始镀金了
      

  10.   

    ps:其实把临时用用,我们还可以用扩展方法,直接对type扩展。只需增加无需修改
      

  11.   

    大大理解錯他的意思了 他的意思是
    [Quote=引用 8 楼  的回复:]
    private bool compareType(Type targetType, object con)
      {
      if (con.GetType().Equals(targetType))
      {
    // 添加代碼
      return true;
      }
      else
      {
    // 添加代碼
      return false;
      }
      }
      

  12.   

    Control难道不行吗,而且还不用类型转换 void 判断控件方法(Control c_l){}
      

  13.   

    用了silverradiance的方法成功实现了,感觉这里用委托大材小用了。caozhy说到委托我想到了之前一样的情况我是用委托实现的回调方法的。感谢各位进来回帖,结贴。
      

  14.   

    在你的“判断控件方法”方法中,怎么会取到cl变量呢?这个不合语法,凭空出现一个cl变量,首先在逻辑上一眼就看出还没有想明白(哪怕只有一两行代码,你也是没有想想,就动手去写了)。
      

  15.   

    假设忽悠你的逻辑问题,单看编程问题,这个程序应该类似这样:  void 判断控件方法(Type c_l)
      if(c_l.IsAssignableFrom(cl.GetType()))
      {
      aa();
      }如果你不考虑继承关系,那么可以这样写:  void 判断控件方法(Type c_l)
      if(c_l==cl.GetType())
      {
      aa();
      }
      

  16.   

    控件的基本父类不是object 而是control   转成contorl  用的时候强转