none
设置变量指定索引的值 RRS feed

  • 问题

  •         public class testclass
            {
                public string aaa { set; get; }
                public string bbb { set; get; }
                public string ccc { set; get; }
            }
            void test()
            {
                List<testclass> lt = new List<testclass>();
    
                for (int x = 0; x < 10; x++)
                {
                    testclass tc = new testclass();
                    tc.aaa = "aaa" + x.ToString();
                    tc.bbb = "bbb" + x.ToString();
                    tc.ccc = "ccc" + x.ToString();
    
                    lt.Add(tc);
                }
                typeof(testclass).GetProperty("bbb").SetValue(lt, "new bbb" ,new object[]{ 5,8 });
                typeof(testclass).GetProperty("ccc").SetValue(lt, "new ccc", new object[]{ 5,8 });
    
                Console.WriteLine(lt[5].bbb);
                Console.WriteLine(lt[8].bbb);
                Console.WriteLine(lt[5].ccc);
                Console.WriteLine(lt[8].ccc);
            }

    2012年11月12日 3:20

答案

  • dear

    你想要改变集合的状态,的应该是操作List,不是testClass

    lt[0].aaa = "aaa";
    lt[0].bbb = "bbb";
    lt[0].ccc = "ccc";

    若你是想要反射 test 里面的 List<testclass>变数

    请参考下篇贴子,或是搜寻"泛型反射"关键字

    http://www.dotblogs.com.tw/regionbbs/archive/2011/02/09/invoke.generic.methods.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年11月12日 4:35
  •  还是无法成功!用反射的方法,希望得到以下效果

    lt[5].bbb="new b5";

    lt[8].bbb="new b8";

    lt[5].ccc="new c5";

    lt[8].ccc="new c8";

    dear 

    我猜想你还是不知道你在干啥?上篇回复你取错变数来反射了,所以你会失败

    因为你的类别成员为非 public 所以会比较辛苦一点,若是public成员可享受到 dynamic 的好处,可参考以下

    http://www.dotblogs.com.tw/yc421206/archive/2012/10/31/79794.aspx

    你贴出的代码是没有必要利用反射来处理的,我压根儿不明白你想做的,用我所理解的反射操作方式,我将你的代码改成以下

    public class testclass
    {
        public string aaa { set; get; }
    
        public string bbb { set; get; }
    
        public string ccc { set; get; }
    
        private List<testclass> lt = new List<testclass>();
    
        public List<testclass> createList()
            {
                lt.Clear();
                for (int x = 0; x < 10; x++)
                {
                    testclass tc = new testclass();
                    tc.aaa = "aaa" + x.ToString();
                    tc.bbb = "bbb" + x.ToString();
                    tc.ccc = "ccc" + x.ToString();
    
                    lt.Add(tc);
                }
                return lt;
            }
    
        public void showList()
            {
                foreach (var value in this.lt)
                {
                    var msg = string.Format("aaa= {0},bbb= {1},ccc= {2}", value.aaa, value.bbb, value.ccc);
                    Console.WriteLine(msg);
                }
            }
    }


    调用testClass

    private void button1_Click(object sender, EventArgs e)
    {
        Type assemblyType = typeof(testclass);
    
        //建立执行个体
        dynamic instance = Activator.CreateInstance(assemblyType);
        if (instance == null) return;
    
        //建立list
        var list = instance.createList();
    
        var field = assemblyType.GetField("lt", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField);
    
        //赋予新的值
        list.Add(new testclass() { aaa = "new aaa", bbb = "new bbb", ccc = "new ccc" });
        field.SetValue(instance, list, BindingFlags.NonPublic | BindingFlags.Instance, null, null);
        instance.showList();
    }


    希望这些代码能对你有帮助,若这些代码真的对你有帮助,希望你不光只会copy-paste,还能深入了解反射的用法

    若你的 lt 变数是 public,便可直接使用 lt

    private void button1_Click(object sender, EventArgs e)
    {
        Type assemblyType = typeof(testclass);
    
        //建立执行个体
        dynamic instance = Activator.CreateInstance(assemblyType);
        if (instance == null) return;
    
        //建立list
        var list = instance.createList();
        instance.lt[0].aaa = "new aaa";
        instance.lt[0].bbb = "new aaa";
        instance.lt[0].bbb = "new ccc";
    
        instance.showList();
    }
    


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/


    2012年11月13日 4:29
  • lt[5].GetType().GetProperty("bbb").SetValue(lt[5], "new bbb5", null);
               
    2012年11月14日 1:24

全部回复

  • dear

    你想要改变集合的状态,的应该是操作List,不是testClass

    lt[0].aaa = "aaa";
    lt[0].bbb = "bbb";
    lt[0].ccc = "ccc";

    若你是想要反射 test 里面的 List<testclass>变数

    请参考下篇贴子,或是搜寻"泛型反射"关键字

    http://www.dotblogs.com.tw/regionbbs/archive/2011/02/09/invoke.generic.methods.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年11月12日 4:35
  • 需要的是 泛型反射,主要是  new object[]{ 5,8 } 这里有问题

    2012年11月12日 4:50
  • 需要的是 泛型反射,主要是  new object[]{ 5,8 } 这里有问题

    dear

    你反射错对象了,你应该要操作的是List<testClass>

    List<testclass> lt = new List<testclass>();

    Type listType = Type.GetType("System.Collections.Generic.List`1");


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年11月12日 6:08
  •  还是无法成功!用反射的方法,希望得到以下效果

    lt[5].bbb="new b5";

    lt[8].bbb="new b8";

    lt[5].ccc="new c5";

    lt[8].ccc="new c8";

    2012年11月12日 11:03
  •  还是无法成功!用反射的方法,希望得到以下效果

    lt[5].bbb="new b5";

    lt[8].bbb="new b8";

    lt[5].ccc="new c5";

    lt[8].ccc="new c8";

    dear 

    我猜想你还是不知道你在干啥?上篇回复你取错变数来反射了,所以你会失败

    因为你的类别成员为非 public 所以会比较辛苦一点,若是public成员可享受到 dynamic 的好处,可参考以下

    http://www.dotblogs.com.tw/yc421206/archive/2012/10/31/79794.aspx

    你贴出的代码是没有必要利用反射来处理的,我压根儿不明白你想做的,用我所理解的反射操作方式,我将你的代码改成以下

    public class testclass
    {
        public string aaa { set; get; }
    
        public string bbb { set; get; }
    
        public string ccc { set; get; }
    
        private List<testclass> lt = new List<testclass>();
    
        public List<testclass> createList()
            {
                lt.Clear();
                for (int x = 0; x < 10; x++)
                {
                    testclass tc = new testclass();
                    tc.aaa = "aaa" + x.ToString();
                    tc.bbb = "bbb" + x.ToString();
                    tc.ccc = "ccc" + x.ToString();
    
                    lt.Add(tc);
                }
                return lt;
            }
    
        public void showList()
            {
                foreach (var value in this.lt)
                {
                    var msg = string.Format("aaa= {0},bbb= {1},ccc= {2}", value.aaa, value.bbb, value.ccc);
                    Console.WriteLine(msg);
                }
            }
    }


    调用testClass

    private void button1_Click(object sender, EventArgs e)
    {
        Type assemblyType = typeof(testclass);
    
        //建立执行个体
        dynamic instance = Activator.CreateInstance(assemblyType);
        if (instance == null) return;
    
        //建立list
        var list = instance.createList();
    
        var field = assemblyType.GetField("lt", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField);
    
        //赋予新的值
        list.Add(new testclass() { aaa = "new aaa", bbb = "new bbb", ccc = "new ccc" });
        field.SetValue(instance, list, BindingFlags.NonPublic | BindingFlags.Instance, null, null);
        instance.showList();
    }


    希望这些代码能对你有帮助,若这些代码真的对你有帮助,希望你不光只会copy-paste,还能深入了解反射的用法

    若你的 lt 变数是 public,便可直接使用 lt

    private void button1_Click(object sender, EventArgs e)
    {
        Type assemblyType = typeof(testclass);
    
        //建立执行个体
        dynamic instance = Activator.CreateInstance(assemblyType);
        if (instance == null) return;
    
        //建立list
        var list = instance.createList();
        instance.lt[0].aaa = "new aaa";
        instance.lt[0].bbb = "new aaa";
        instance.lt[0].bbb = "new ccc";
    
        instance.showList();
    }
    


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/


    2012年11月13日 4:29
  • 谢谢您!让您为我那么详细的指导。

    还有一个问题,假如List<T>中有不同的类,比如:testclass1、testclass2,等等,现在如何把这个List<T>参数传递进来.(我知道用ArrayList可以)

    List<testclass1> Lt1 = new List<testclass1> ();

    List<testclass2> Lt2 = new List<testclass2> ();

    void test (List<T> Plt)

    {.............}

    void execute ( )

    {

    test (Lt1);

    test(Lt2);

    }


    2012年11月13日 14:48
  • dear

    你是要问反射还是要问泛型约束??

    如果是另外一个问题,请开另一个主题,别让此主题失焦,这样能帮助到其他人方便搜寻这贴子。


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年11月13日 16:56
  • lt[5].GetType().GetProperty("bbb").SetValue(lt[5], "new bbb5", null);
               
    2012年11月14日 1:24