积极答复者
设置变量指定索引的值

问题
-
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); }
答案
-
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/
- 已建议为答案 Jason Dot WangModerator 2012年11月14日 3:01
- 已标记为答案 Jason Dot WangModerator 2012年11月20日 9:23
-
还是无法成功!用反射的方法,希望得到以下效果
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/
- 已编辑 余小章MVP 2012年11月13日 4:33
- 已建议为答案 Jason Dot WangModerator 2012年11月14日 3:06
- 已标记为答案 Jason Dot WangModerator 2012年11月20日 9:23
全部回复
-
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/
- 已建议为答案 Jason Dot WangModerator 2012年11月14日 3:01
- 已标记为答案 Jason Dot WangModerator 2012年11月20日 9:23
-
还是无法成功!用反射的方法,希望得到以下效果
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/
- 已编辑 余小章MVP 2012年11月13日 4:33
- 已建议为答案 Jason Dot WangModerator 2012年11月14日 3:06
- 已标记为答案 Jason Dot WangModerator 2012年11月20日 9:23
-
谢谢您!让您为我那么详细的指导。
还有一个问题,假如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:50