假设已知DataSet如下:有两列,ID和User,ID类型是int,User类型是string
ds = new DataSet("UserDataSet");
DataTable dt = new DataTable("UerTable");
dt.Columns.Add("User",typeof(System.String));
dt.Columns.Add("ID",typeof(System.Int32));
DataRow row = dt.NewRow();
row["User"]="a";
row["ID"]=1;
dt.Rows.Add(row);
row = dt.NewRow();
row["User"]="b";
row["ID"]=2;
dt.Rows.Add(row);
ds.Tables.Add(dt);要求生成的object[]有两个property,int ID和string User,或者filed成员都行。
C#可以实现吗?
求助高手

解决方案 »

  1.   

    因为Web Services中的DataSet传送效率不高,但pocket pc做解压缩损耗又太大。
    所以想传数组,减少DataSet中的数据量。
    DataSet有很多列的,个人觉得Hashtable不能实现,谢谢回应
      

  2.   

    .ItemArray// 要求生成的object[]有两个property,int ID和string User,或者filed成员都行
    或者你准备做O/R Mapping?
    那和object[]有什么关系
      

  3.   

    係将DataSet内容每一行转成一个object,一个DataSet转换成object[]的数组。
    因为DataSet的列内容是可变的,所以想每次用反射机理新建object存储。
    我先看看.ItemArray,谢谢
      

  4.   

    不好意思,问题不是太清楚,是一个DataRow返回一个object,DataSet返回object[]数组。
    可实现吗?
      

  5.   

    >>>是一个DataRow返回一个object,DataSet返回object[]数组。可实现吗?
    想从DataRow返回一个什么样的对象?在.NET里,任何对象都相应的特定类的, 你的意思是要动态地产生新类么?
      

  6.   

    by the way, object[] is an Object itself
      

  7.   

    但上百万条记录的传输损耗更大。Web Services传输唔快吖。
    的确想动态生成类。
    想法是奇怪了点。
    如果对每种DataSet建立一种类,返回该类的数组已经实现。但为了通用性吖。
    记录不会太大的,但DataSet在Web Services的确效率不好,而且pocket pc的支持也不好,
    模拟器老是出这样那样的exception
    如ppc 2003 Emulator出platformnotsupportedexception
    ppc  2003 se又不支持ip访问web Services
    怕到时出问题吖
      

  8.   

    我知道object[]继承于array,array继承于object
      

  9.   

    可以,不过不明白为什么要用反射。好像和反射没有关系的,直接用DataSet/DataTable的属性、方法等就可以生成一个object[]了。另外,你就说说看你这个DataSet最后生成的object[]是什么样子呢?
      

  10.   

    非常谢谢superhasty,
    最有生成的object[]里面应该有2个object
    每个object有string User 和int ID两个成员或属性。
    名称和列名一样,赋值就和列值一样。可以吗?谢谢。昨晚睡了,没及时回答
      

  11.   

    用DataSet就得忍受它的传输效率低,否则用ORMapping,再则压缩一下.
      

  12.   

    你要的不是这个吧,一个数据数组:
    int x=ds.Tables[0].Rows.Count; 
    int y=ds.Tables[0].Columns.Count;
    //object[,] myArr=new Object[x,y];
    object[][] myArr=new object[x][];
    for(x=0;x<ds.Tables[0].Rows.Count;x++)
    {
        myArr[x]=new object[y];
        for(y=0;y<ds.Tables[0].Columns.Count;y++)
        {
    myArr[x][y]=ds.Tables[0].Rows[x][y];
        }
    }
    //MessageBox.Show(myArr.Length.ToString());
    //MessageBox.Show(myArr[0].Length.ToString());这里得到的是一个二维数组,要是想得到一维数组的话,就要自己写一个类了。因为
    o你想要的类既要能容纳所有数据类型,而又必须一个对象里面有多个成员。那就从object派生一个类出来吧,这个类里面有多个object成员。类写完后,照上面的代码改成一维数组就是你要的了。不过,我觉得这样并不能提高性能吧。通常提高WebService传输效率都是序列化,有必要的话还可以压缩到达目的地后再解压缩。
      

  13.   

    >>>每个object有string User 和int ID两个成员或属性。名称和列名一样,赋值就和列值一样。if that is all you need, try to create a class, like[Serializable()]        
    public class SimpleObject  
    {
        public string Name;
        public Object Value; //int Value;   
    }then, just do a conversion on datarow
    DataRow dr = .....;SimpleObject [] so = new SimpleObject [dr.Table.Columns.Count];
    for(int i=0; i < so.Length ;i++)
    {
      so[i] = new SimpleObject();
      so[i].Name = dr.Table.Columns[i].ColumnName;
      so[i].Value = dr[dr.Table.Columns[i]];
    }....
      

  14.   

    的确我想动态生成object,但成员要根据DataRow的列名和列值决定。如果是静态一切都简单,object[][]传送后又不知道列值。
    看来我得放弃了,呵呵。
    谢谢各位