万金流
以码会友。 吾Q:578751655。 水平有限,轻喷,谢!
随笔 - 189,  文章 - 0,  评论 - 7,  阅读 - 14万

朋友遇到的一个问题:

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

读者应该不难自己完成。

posted on   万金流  阅读(571)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现

点击右上角即可分享
微信分享提示