【Unity】利用C#反射打印类的字段信息
- 最近在用protobuf-net序列化功能生成.bytes配置文件时,遇到了需要把.bytes配置文件再另外转成Lua配置文件(Lua配置表内容举例)的需求。Lua配置文件需要记录配置类的各个字段名和具体值,不可能一个个复制粘贴来写,因为除了费心费时,还有一个原因:如果以后配置类的字段名变化(例如重构时改名、新增字段)则对应生成代码也得改,所以必须使用反射来完成生成工作。
- 以下用StudentCfg类作为举例,使用反射打印字段名、字段值,考虑到他人设计类时可能会使用List<T>类型,也一起处理了这部分内容。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine; public class testMisc : MonoBehaviour
{
public class StudentCfg
{
public int id;
public string name;
public List<int> scoreList = new List<int>();
private string _desc = "";
public string desc
{
get { return _desc; }
set { _desc = value; }
} } void Start()
{
StudentCfg studentCfg = new StudentCfg();
studentCfg.id = 1000;
studentCfg.name = "丽丽";
studentCfg.scoreList.Add(100);
studentCfg.scoreList.Add(95);
studentCfg.desc = "爱好:滑雪"; PrintFieldInfo(studentCfg);
PrintPropertyInfo(studentCfg); } private void PrintFieldInfo(object classInstance)
{
FieldInfo[] fields = classInstance.GetType().GetFields();
foreach (FieldInfo info in fields)
{
object value = info.GetValue(classInstance);
// 使用info.GetType()不会得到准确类型
Debug.LogFormat("字段值: {0}, 字段类型:{1}", value, info.FieldType);
if (IsListT(info.FieldType))
{
// 获取List<T>的T的类型
Type listType = value.GetType().GetGenericArguments()[0];
Debug.LogFormat("列表类型: {0}", listType);
IEnumerable list = (IEnumerable)value;
foreach (var item in list)
{
Debug.LogFormat("列表 单位值: {0}", item);
}
}
} } private void PrintPropertyInfo(object classInstance)
{
PropertyInfo[] props = classInstance.GetType().GetProperties();
foreach (PropertyInfo info in props)
{
object value = info.GetValue(classInstance, null);
// 使用info.GetType()不会得到准确类型
Debug.LogFormat("属性值: {0}, 属性类型:{1}", value, info.PropertyType);
if (IsListT(info.PropertyType))
{
// 获取List<T>的T的类型
Type listType = value.GetType().GetGenericArguments()[0];
Debug.LogFormat("列表类型: {0}", listType);
IEnumerable list = (IEnumerable)value;
foreach (var item in list)
{
Debug.LogFormat("列表 单位值: {0}", item);
}
}
} } private bool IsListT(Type type)
{
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
{
return true;
}
return false; } }
- 运行效果如下:

【Unity】利用C#反射打印类的字段信息的更多相关文章
- 利用Java反射根据类的名称获取属性信息和父类的属性信息
代码: import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java ...
- 利用java反射调用类的的私有方法--转
原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...
- 利用Xposed Hook打印Java函数调用堆栈信息的几种方法
本文博客链接:http://blog.csdn.net/QQ1084283172/article/details/79378374 在进行Android逆向分析的时候,经常需要进行动态调试栈回溯,查看 ...
- Java反射获取类和对象信息全解析
反射可以解决在编译时无法预知对象和类是属于那个类的,要根据程序运行时的信息才能知道该对象和类的信息的问题. 在两个人协作开发时,你只要知道对方的类名就可以进行初步的开发了. 获取类对象 Class.f ...
- 用arthas查看JVM已加载的类及方法信息
1.sc:“Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息,这个命令支持的参数有 [d].[E].[f] 和 [x:]. [d] 输出当前类的详细信 ...
- C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西付给另一个类对象,而不是付给引用地址)
from:https://blog.csdn.net/poxiaohai2011/article/details/27555951 //C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西 ...
- java利用反射打印出类的结构
1 输入一个类名:java.lang.String将打印出String类定义的结构,例如: public final class java.lang.String { public java.lang ...
- 【Android开发经验】使用反射,得到的类的字段、方法、并实现了简单的调用
本文后推出Android的ICO框架做准备,所以,假设你想要一个最近的一项研究Android的ICO学生框架.你可以稍微看一下. 首先,简介一下Java里面的反射. JAVA反射机制是在执行状态中,对 ...
- java利用反射调用类的某个方法
java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...
- java利用反射获取类的属性及类型
java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...
随机推荐
- Linux下hadoop和spark的基础环境配置准备
我使用了4台虚拟机centos7来搭建环境, 2个主结点(一般是一个,但为了体验zookeeper,万一其中一个master挂掉呢,另外一个会自动启动接管), 2个从结点 注意:下面的配置主要以主节点 ...
- SqlSession的提交commit
SqlSession.commit(); 是执行了事务的提交
- 如何让一个 div 左右各空一定距离然后 div 占满剩下的宽度?
如何让一个 div 左右各空一定距离然后 div 占满剩下的宽度? 最开始想到的方法就是 div 宽度取 n%, style 设置 margin:auto. 但是这样有一个问题,一定距离是根据 n 的 ...
- sshpass免密登录源码剖析
源码下载地址:https://sourceforge.net/projects/sshpass/ 免密登陆程序sshpass源码解析,短小精悍的程序,非常值得学习!
- mathcurve.com
https://mathcurve.com/surfaces.gb/surfaces.shtml
- apk反编译工具--dex2jar
dex2jar 2.1 https://github.com/pxb1988/dex2jar/releases 链接: https://pan.baidu.com/s/1ZU16mPE_QNhzWxF ...
- git通过ssh方式免密克隆代码仓库
git上添加ssh公钥 略过 终端命令行 格式: git clone ssh://[user@]host.xz[:port]/path/to/repo.git/ 栗子: git clone ssh:/ ...
- Ubuntu tmux使用教程
sudo apt-get install tmux 安装tmux tmux new -s session_name 新开一个会话 tmux a -t session_name 查看指定会话 tmux ...
- mysql设置表名不区分大小写
1.root登录,修改/etc/my.cnf2.在mysqld下加入:lower_case_table_names=13.重新数据库
- Django启动时提示ModuleNotFoundError: No module named 'xxx'的原因
①创建项目:django-admin startproject DL ②创建app:python manage.py startapp myapp ③启动服务:python manage.py run ...