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为例相关推荐

  1. C# 利用反射动态创建对象[摘录]

    摘自:http://hi.baidu.com/yangyuhang/blog/item/f12ea90e13f214e336d12250.html 在VS.Net中,有很多种方法动态调用对象的构造函数 ...

  2. protobuf在java应用中通过反射动态创建对象

    2019独角兽企业重金招聘Python工程师标准>>> ---恢复内容开始--- 最近编写一个游戏用到protobuf数据格式进行前后台传输,苦于protobuf接受客户端的数据时是 ...

  3. protobuf java 自动反射_protobuf在java应用中通过反射动态创建对象

    最近编写一个游戏用到protobuf数据格式进行前后台传输,苦于protobuf接受客户端的数据时是需要数据类型的如xxx.parseForm(-),这样就要求服务器在接受客户端请求时必须知道客户端传 ...

  4. 用反射动态创建对象,类型无法转换的困惑

    企图:从XML读出节点并动态创建形成对象. 参考:http://www.cnblogs.com/Arlen/archive/2007/05/30/765506.html 工厂中的代码: public  ...

  5. 利用反射动态创建对象

    http://www.csharpwin.com/csharpspace/9314r9141.shtml 转载于:https://www.cnblogs.com/weihongli/archive/2 ...

  6. 反射学习笔记之动态创建对象和调用方法

    动态加载和静态引用的程序集并不是同一个Assembly了.事实上,在.Net中,同一个应用程序域并不允许同时加载两个相同的Assembly.即使加载了,也会认为是两个不同的程序集.如果要同时加载两个, ...

  7. 利用Qt元对象技术防止工厂模式下代码臃肿问题,QT 动态创建对象(第2种方法)

    问题的提出: 近来要编写一个仿真液压.电力.机械的软件,如下为液压的: 可以看到液压图中很多液压元器件,这些元器件的id.名称等都是从json配置文件读取的,配置文件格式如下: {"Clas ...

  8. 反射动态调用DLL类库测试

    定义:可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等.有了反射,即可对每一个类型了如指掌 ...

  9. 【java】深入分析Java反射-动态代理 proxy

    1.概述 转载:深入分析Java反射(四)-动态代理 [Java]Java 反射机制浅析 [Java]java代理 静态代理 动态代理 proxy [java]静态代理 proxy 2.动态代理的简介 ...

最新文章

  1. 盘点图灵30篇最受欢迎微信文章
  2. Linux常用软件和安装方法,Linux软件安装与卸载常用方法(转)
  3. 95. Unique Binary Search Trees II
  4. js点击图片查看大图,并可以拖动,且滚动滑轮放大缩小
  5. python re爬虫_Python爬虫实践 —— Regular Expressions Python re模块
  6. 机器学习精讲中7.1固定特征核中关于N维向量多项式特征映射的理解(二)
  7. Python的输出、判断、循环函数:Luogu1014Cantor表
  8. C# Graphics 透明 gif 进度条
  9. StringUtil和StringUtils的区别
  10. 4g 控矿驱动 迪兰rx574_用结果说话 篇四:迪兰RX580 2048SP 4G X-Serial战将i7-8700与R5 2400G双平台体验点评...
  11. 水果忍者腾讯版 v1.0.2 官方安卓版下载
  12. 微信小程序全国巡回沙龙杭州站-芋头演讲详细内容及PPT
  13. 「系统介绍」简单介绍下PMS系统
  14. 如何将彩色文本打印到终端?
  15. 如何设计好的RESTful API 之好的RESTful API 特征
  16. android 微信摇一摇代码,Android微信摇一摇
  17. Ubuntu卸载python3.6
  18. 电路中的中英文词汇对照
  19. Python实现FM (附代码与数据)
  20. (附源码)php学生考勤管理系统-计算机毕设080900

热门文章

  1. 3个月转行数据分析师,你需要掌握这些内容
  2. 岗位推荐 | 腾讯音乐娱乐招聘推荐算法工程师、推荐后台工程师
  3. 本周值得读:13 份最新开源「Paper + Code」
  4. stm32延时us寄存器_STM32延时函数的四种方法
  5. IntelliJ IDEA安装
  6. 2017计算机考研统考大纲,2017年考研计算机大纲详解(六):计算机网络
  7. es查询大文本效率_es中terms查询速度能否优化
  8. java按位取反“~“运算符,负数右移
  9. 《计算机网络》实验报告——常用网络命令
  10. BugKuCTF 加密 easy_crypto