朋友遇到的一个问题:
从文本里读出的字符串("张三","20"...),类型以字符串形式已知("string","int"....)
希望转换成类对象。
数据多的情况下,频繁使用反射有可能影响效率,故写了个小demo如下:
Person类:
1 class Person 2 { 3 public string xm { get; set; } 4 public int nl { get; set; } 5 public void showme() 6 { 7 Console.WriteLine("我是" + xm + ",我今年" + nl + "岁。"); 8 } 9 }
转换辅助类:
class Convert_Helper { static PropertyInfo[] ps; //送入类型,反射回所有公共属性 public static void get_Props<T>(T tt) { ps=tt.GetType().GetProperties(); } //送入字符串和类型,返回指定类型的值 public static dynamic change_Type(string x,string x_type) { if(x_type=="int") { return int.Parse(x); } return x; } //送入对象、值和类型,为对象赋值。 public static void get_Object(dynamic obj,string[] myvalues,string[] valuetype) { for (int i = 0; i < myvalues.Length; i++) { ps[i].SetValue(obj, change_Type(myvalues[i], valuetype[i]), null); } } }
主程序:
1 static void Main(string[] args) 2 { 3 string[] v1,t1; 4 List<Person> mylist=new List<Person>(); 5 Person t; 6 Convert_Helper.get_Props(new Person()); 7 8 t = new Person(); 9 v1=new string[2]{"张三","20"}; 10 t1 = new string[2] { "string", "int" }; 11 Convert_Helper.get_Object(t,v1,t1); 12 mylist.Add(t); 13 14 t = new Person(); 15 v1 = new string[2] { "李四", "18" }; 16 t1 = new string[2] { "string", "int" }; 17 Convert_Helper.get_Object(t, v1, t1); 18 mylist.Add(t); 19 20 foreach (var item in mylist) 21 { 22 item.showme(); 23 } 24 Console.ReadKey(); 25 }
到此,文本即使是批量的二维数组或其他格式,主程序稍加修改即可;如果属性不对应,对get_Props方法稍加修改即可。
读者应该不难自己完成。