代码如下:
object obj = new object();
ArrayList list = new ArrayList();
while(...)
{
.....对obj操作的代码
list.add(obj);
}
list中添加是obj的引用如何将每次添加的obj复制一份添加到list中呢。现在的效果是所有的obj都变成了最后add的那个obj

解决方案 »

  1.   

    实现ICloneable接口,添加到list之前调用obj.Clone();
      

  2.   

    object obj = new object(); 
    把这个初始化放到while循环里while(...) 

    object obj = new object(); 
    .....对obj操作的代码 
    list.add(obj); 

      

  3.   

    obj在循环中不能new,obj是通过参数传过来的new了就不对了
      

  4.   

    Clone是浅复制我需要深度复制包括所有的信息
      

  5.   


    那你自己写一个复制的Clone方法帮助实现吧。SqlHelper里面有一段是自己写了一个拷贝SqlParameter的代码,可以找到参考一下。
      

  6.   


    你错了.ICloneable接口可以做深拷贝也可以搞浅拷贝,
    具体要看你的object是怎么个实现
      

  7.   

    举例:public class Program
        {        static void Main(string[] args)
            {
                A a = new A();
                a.b.Str = "1";            A newA = (A)a.Clone();
                newA.b.Str = "2";            Console.WriteLine(a.b.Str);
                Console.WriteLine(newA.b.Str);            Console.ReadKey();
            }    }    public class A : ICloneable
        {
            public B b = new B();
            public object Clone()
            {
                A a = new A();
                return a;
            }
        }    public class B
        {
            private string _str = string.Empty;
            public string Str
            {
                get
                {
                    return _str;
                }
                set
                {
                    _str = value;
                }
            }
        }
      

  8.   

    ls的没看懂意思这是在反射中应用不知道具体类型的就是对一个object操作,如何复制一个object的副本呢???
      

  9.   

    对于楼主的例子,list中存的应该是你每次修改后的obj的值,而不是list中所有的项都是最后一次object被修改的值,你可以试试:
    object o = new object();
                ArrayList list = new ArrayList();            for (int i = 0; i < 5; i++)
                {
                    o = i;
                    list.Add(o);
                }            for (int i = 0; i < list.Count; i++)
                    Console.WriteLine(list[i].ToString());
      

  10.   

    已经试了这个结果应该是list中所有的o都是4
      

  11.   

    晕倒.
    NEW一下那里会不对呢? while(...) 

    object obj = new object(); 
    .....对obj操作的代码 //这里是你操作obj的代码.
    list.add(obj); 
    } 每次new一个object对象,在堆里为obj分配内存地址.你之前的错误就是在内存中只分配了一次内存地址,之后的操作是反复的在这个内存地址写数据.
      

  12.   

    ls的还是没看懂意思啊是不能new啊obj是传过来的new了就不对了
      

  13.   

    帮你顶一下啦,可以试一下类似于DataTable的copy()方法.
    DataTable dt = new DataTable();
    DataTable tdt = dt.copy();
      

  14.   

    现在是不知道具体类型还copy我就好办了
      

  15.   

    这个当然可以obj=int类型类型是个值类型
      

  16.   

    被你逼疯了-_-!public class Program
        {        static void Main(string[] args)
            {
                object o = new object();
                ArrayList list = new ArrayList();
                A a = new A();
                for (int i = 0; i < 5; i++)
                {
                    A newA = (A)a.Clone();
                    newA.b.Str = i.ToString();
                    o = newA;
                    //a.b.Str = i.ToString();//这两行代码去掉注释,把前行前的三段注释掉可以对比一下结果
                    //o = a;
                    list.Add(o);
                }            for (int i = 0; i < list.Count; i++)
                    Console.WriteLine((((A)list[i]).b.Str));                Console.ReadKey();
            }    }    public class A : ICloneable
        {
            public B b = new B();
            public object Clone()
            {
                A a = new A();
                return a;
            }
        }    public class B
        {
            private string _str = string.Empty;
            public string Str
            {
                get
                {
                    return _str;
                }
                set
                {
                    _str = value;
                }
            }
        }
      

  17.   

        public class A : ICloneable
        {
            public B b = new B();
            public object Clone()
            {
                A a = new A();
                return a;
            }
        }
    克隆和直接new一个对象,有区别吗?
      

  18.   


    看看下例,看看有区别吗?
     public class Program
        {
            static void Main(string[] args)
            {
                A a = new A();
                a.str = "1";
                A _a = (A)a.Clone();
                a.str = "2";
                Console.WriteLine(_a.str);
                Console.WriteLine(a.str);
                Console.ReadKey();
            }    }    public class A : ICloneable
        {
            public string str = string.Empty;
            public object Clone()
            {
                A a = new A();
                a.str = str;
                return a;
            }
        }
      

  19.   

    如果不知道对象是什么就确实难解,只能靠反射自己构建一个对象,不过我有一点不明白,如果楼主你都不知道对象是什么那么怎么对他进行操作?因为所有的方法,特性都是不知道的,除非你只要ToString(),GetHashCode()这一类的方法
      

  20.   

    我也遇到同样的问题,我是用反射获取并操作对象,但是将处理后的对象循环添加到List<object>中发现所有的元素全是一样的,查了一整天,要疯了!……