反射动态创建对象_Json为例
1. 取得数据类型Type
方式一:Type.GetType(“类型全名”);
适合于类型的名称已知
方式二:obj.GetType();
适合于类型名未知,类型未知,存在已有对象
方式三:typeof(类型)
适合于已知类型
方式四:Assembly.Load(“XXX”).GetType(“名字”);
适合于类型在另一个程序集中
实例
Type type =Type.GetType("Day07.MainCity");
//Type type = city.GetType();
//Type type = typeof(MainCity);
2. 动态创建对象
Activator.CreateInstance(string 程序集名称,string 类型全名)
Activator.CreateInstance(Type type);
Assembly assembly = Assembly.Load(程序集);
assembly.CreateInstance(Type);
//找到有参构造方法,动态调用构造方法
type.GetConstructor(typeof(string)).Invoke()
实例
//动态创建对象
object obj = Activator.CreateInstance(type);
3.Type类常用Get系列方法 Is系列属性。
2. MethodInfo(方法)
重要方法: Invoke
MethodInfo method = type.GetMethod("PrintName");
method.Invoke(obj, null);
MethodInfo methodFun1 =type.GetMethod("Fun1", BindingFlags.NonPublic |BindingFlags.Instance);
methodFun1.Invoke(obj, null);
3. PropertyInfo(属性)
重要方法:SetValueGetValue
4. FieldInfo(字段)
重要方法:SetValueGetValue
5. ConstructInfo(构造方法)
重要方法:Invoke
实例
//获取类型信息
PropertyInfo property = type.GetProperty("Name");
property.SetValue(obj, "abc");
//property.SetValue(obj, "100");
属性类型转换
//1.属性类型:
property.PropertyType
//2.字符串转换为属性类型:
//Convert.ChangeType("100", property.PropertyType);
/*
Json 字符串格式
* {"Name" : "abc","HP":"100"}
*
JsonHelper
-- c# 对象 --> Json字符串
-- Json字符串 --> c#对象
* (提示
* 1. 泛型方法
* 2.
* )
*/
反射与缓存结合使用
转换方法实现
//-- c# 对象 --> Json字符串
//{"Name" : "abc","HP":"100"}
public static string ObjectToString(object obj)
{
StringBuilder builder = new StringBuilder();
builder.Append("{");
//获取类型信息
Type type = obj.GetType();
//获取当前类型所有属性
foreach (var p in type.GetProperties())
{
builder.AppendFormat("\"{0}\":\"{1}\",",p.Name, p.GetValue(obj));
}
builder.Remove(builder.Length- 1, 1);
builder.Append("}");
return builder.ToString();
}
//-- Json字符串 --> c#对象
//{"Name" : "abc","HP":"100"}
public static T StringToObject<T>(string jsonString)//whereT:new()
{
//创建对象
//T obj = new T();
Type type = typeof(T);
object obj = Activator.CreateInstance(type);
//根据字符串为属性赋值
//{"Name" : "abc","HP":"100"}
//去除字符 { " }
jsonString = jsonString.Replace("{", "").Replace("\"","").Replace("}", "");
//Name:abc,HP:100,MaxHP:100
string[] keyValue = jsonString.Split(',', ':');
for (int i = 0; i < keyValue.Length; i+=2)
{
//keyValue[i] keyValue[i+1]
var property =type.GetProperty(keyValue[i]);
object propertyVal =Convert.ChangeType(keyValue[i + 1], property.PropertyType);
property.SetValue(obj,propertyVal);
}
return (T)obj;
}
}
反射动态创建对象_Json为例相关推荐
- C# 利用反射动态创建对象[摘录]
摘自:http://hi.baidu.com/yangyuhang/blog/item/f12ea90e13f214e336d12250.html 在VS.Net中,有很多种方法动态调用对象的构造函数 ...
- protobuf在java应用中通过反射动态创建对象
2019独角兽企业重金招聘Python工程师标准>>> ---恢复内容开始--- 最近编写一个游戏用到protobuf数据格式进行前后台传输,苦于protobuf接受客户端的数据时是 ...
- protobuf java 自动反射_protobuf在java应用中通过反射动态创建对象
最近编写一个游戏用到protobuf数据格式进行前后台传输,苦于protobuf接受客户端的数据时是需要数据类型的如xxx.parseForm(-),这样就要求服务器在接受客户端请求时必须知道客户端传 ...
- 用反射动态创建对象,类型无法转换的困惑
企图:从XML读出节点并动态创建形成对象. 参考:http://www.cnblogs.com/Arlen/archive/2007/05/30/765506.html 工厂中的代码: public ...
- 利用反射动态创建对象
http://www.csharpwin.com/csharpspace/9314r9141.shtml 转载于:https://www.cnblogs.com/weihongli/archive/2 ...
- 反射学习笔记之动态创建对象和调用方法
动态加载和静态引用的程序集并不是同一个Assembly了.事实上,在.Net中,同一个应用程序域并不允许同时加载两个相同的Assembly.即使加载了,也会认为是两个不同的程序集.如果要同时加载两个, ...
- 利用Qt元对象技术防止工厂模式下代码臃肿问题,QT 动态创建对象(第2种方法)
问题的提出: 近来要编写一个仿真液压.电力.机械的软件,如下为液压的: 可以看到液压图中很多液压元器件,这些元器件的id.名称等都是从json配置文件读取的,配置文件格式如下: {"Clas ...
- 反射动态调用DLL类库测试
定义:可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等.有了反射,即可对每一个类型了如指掌 ...
- 【java】深入分析Java反射-动态代理 proxy
1.概述 转载:深入分析Java反射(四)-动态代理 [Java]Java 反射机制浅析 [Java]java代理 静态代理 动态代理 proxy [java]静态代理 proxy 2.动态代理的简介 ...
最新文章
- 盘点图灵30篇最受欢迎微信文章
- Linux常用软件和安装方法,Linux软件安装与卸载常用方法(转)
- 95. Unique Binary Search Trees II
- js点击图片查看大图,并可以拖动,且滚动滑轮放大缩小
- python re爬虫_Python爬虫实践 —— Regular Expressions Python re模块
- 机器学习精讲中7.1固定特征核中关于N维向量多项式特征映射的理解(二)
- Python的输出、判断、循环函数:Luogu1014Cantor表
- C# Graphics 透明 gif 进度条
- StringUtil和StringUtils的区别
- 4g 控矿驱动 迪兰rx574_用结果说话 篇四:迪兰RX580 2048SP 4G X-Serial战将i7-8700与R5 2400G双平台体验点评...
- 水果忍者腾讯版 v1.0.2 官方安卓版下载
- 微信小程序全国巡回沙龙杭州站-芋头演讲详细内容及PPT
- 「系统介绍」简单介绍下PMS系统
- 如何将彩色文本打印到终端?
- 如何设计好的RESTful API 之好的RESTful API 特征
- android 微信摇一摇代码,Android微信摇一摇
- Ubuntu卸载python3.6
- 电路中的中英文词汇对照
- Python实现FM (附代码与数据)
- (附源码)php学生考勤管理系统-计算机毕设080900
热门文章
- 3个月转行数据分析师,你需要掌握这些内容
- 岗位推荐 | 腾讯音乐娱乐招聘推荐算法工程师、推荐后台工程师
- 本周值得读:13 份最新开源「Paper + Code」
- stm32延时us寄存器_STM32延时函数的四种方法
- IntelliJ IDEA安装
- 2017计算机考研统考大纲,2017年考研计算机大纲详解(六):计算机网络
- es查询大文本效率_es中terms查询速度能否优化
- java按位取反“~“运算符,负数右移
- 《计算机网络》实验报告——常用网络命令
- BugKuCTF 加密 easy_crypto