利用反射,把数组里的数据变成指定类对象里的

朋友遇到的一个问题:

从文本里读出的字符串("张三","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方法稍加修改即可。

读者应该不难自己完成。

原文地址:https://www.cnblogs.com/wanjinliu/p/12167948.html