none
泛型 RRS feed

  • 问题

  • 我用vs生成了一堆强类型的DataTable, 需要统一对表的某些字段进行更新.private void SetUpdateInfo(DataTable dt). 但是由于是强类型,所以每个参数都不同.请问是否能用泛型来做?
    我对泛型不了解, 修改成一下的:private void SetUpdateInfo<T>(T datatable) . 但是这样在方法体不能按照DataTable 找到它的行/列.不知如何操作.
    2010年3月3日 2:52

答案

  • 你好!

    如果使用泛型,这里获取或设置属性需要使用到反射。如下:

    public void SetValue<T>(T value)
    {
        PropertyInfo propertyInfo = value.GetType().GetProperty("Id");

        if (propertyInfo != null)
            propertyInfo.SetValue(value, "yourValue", null);
    }

    另外 DataTable 本身可以使用下面的方式来获取值或设置值,这里不使用泛型也可以。

    string id = (string)row["Id"];
    row["Id"] = "yourValue";

    知识改变命运,奋斗成就人生!
    2010年3月3日 3:36
    版主
  • 2010年3月3日 6:01
  • 你好!
         可以尝试为类型参数添加约束,这样就可以使用使用DataTable的成员了:
    private void SetUpdateInfo<T>(T datatable) where T:DataTable
    {
        ...
    }
    希望对你有帮助!
    周雪峰
    2010年3月3日 6:56
    版主
  • 即使不用泛型,而用接口,用基类,都行。

    用接口麻烦点,得全部加上接口,不过最规范。

    用基类比较方便,直接传datatable进去,然后强制转换,之后爱干嘛干嘛

    private void SetUpdateInfo(DataTable dt)
    {
      if(dt.GetType().ToString() == "MyDataTable")
      {
        MyDataTable mydt = (MyDataTable)dt;
        mydt[0].Id = ....
      }
      else if(....)
      {
        ....
      }

    }


    厄,上面的似乎答非所问,懒的删了 = =


    private void SetUpdateInfo(DataTable dt)
    {
      if(dt[0]["Id"] != null)
      {
        int oldid = (int)dt[0]["Id"];
        dt[0]["Id"] = oldid + 123;
      }
    }
    类型再强也逃不过基类,dataset的强类型只不过是把字段变成属性而已,原来的方法一样能用。不包含的字段就是null了,不过还有更好的判断方法,这里就懒一下了。
    霸王
    2010年3月5日 13:28
  • 如果你的所有表都用这个方法来提交的话可以使用泛型,就是传入不同的表,处理起来不一样。如果当成泛型,肯定找不到的,因为它在你写代码时还没有类型。我觉得你用一个接口,来定义你的表,然后再用不同的表来实现你的接口,这样做比较好一点。



    山西.net俱乐部
    2010年3月9日 3:58
    版主

全部回复

  • 可以用泛型呀,
    2010年3月3日 3:07
  • 你好!

    如果使用泛型,这里获取或设置属性需要使用到反射。如下:

    public void SetValue<T>(T value)
    {
        PropertyInfo propertyInfo = value.GetType().GetProperty("Id");

        if (propertyInfo != null)
            propertyInfo.SetValue(value, "yourValue", null);
    }

    另外 DataTable 本身可以使用下面的方式来获取值或设置值,这里不使用泛型也可以。

    string id = (string)row["Id"];
    row["Id"] = "yourValue";

    知识改变命运,奋斗成就人生!
    2010年3月3日 3:36
    版主
  • 2010年3月3日 6:01
  • 你好!
         可以尝试为类型参数添加约束,这样就可以使用使用DataTable的成员了:
    private void SetUpdateInfo<T>(T datatable) where T:DataTable
    {
        ...
    }
    希望对你有帮助!
    周雪峰
    2010年3月3日 6:56
    版主
  • 即使不用泛型,而用接口,用基类,都行。

    用接口麻烦点,得全部加上接口,不过最规范。

    用基类比较方便,直接传datatable进去,然后强制转换,之后爱干嘛干嘛

    private void SetUpdateInfo(DataTable dt)
    {
      if(dt.GetType().ToString() == "MyDataTable")
      {
        MyDataTable mydt = (MyDataTable)dt;
        mydt[0].Id = ....
      }
      else if(....)
      {
        ....
      }

    }


    厄,上面的似乎答非所问,懒的删了 = =


    private void SetUpdateInfo(DataTable dt)
    {
      if(dt[0]["Id"] != null)
      {
        int oldid = (int)dt[0]["Id"];
        dt[0]["Id"] = oldid + 123;
      }
    }
    类型再强也逃不过基类,dataset的强类型只不过是把字段变成属性而已,原来的方法一样能用。不包含的字段就是null了,不过还有更好的判断方法,这里就懒一下了。
    霸王
    2010年3月5日 13:28
  • 如果你的所有表都用这个方法来提交的话可以使用泛型,就是传入不同的表,处理起来不一样。如果当成泛型,肯定找不到的,因为它在你写代码时还没有类型。我觉得你用一个接口,来定义你的表,然后再用不同的表来实现你的接口,这样做比较好一点。



    山西.net俱乐部
    2010年3月9日 3:58
    版主