【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 ...
随机推荐
- JS二进制:File、Blob、FileReader、ArrayBuffer、Base64
原文链接:https://mp.weixin.qq.com/s/IarZDzv9dLD5suL5zdZNcQ JavaScript 提供了一些 API 来处理文件或原始文件数据,例如:File.Blo ...
- VM-tools灰色无法安装
VM-tools灰色无法安装 选择"使用物理驱动器-自动检测". 参考链接: [1] https://www.jianshu.com/p/af4313d92fee
- Python 面试题整理
一.语言特性 1.什么是Python?使用Python有什么好处?Python和其他语言的区别? Python是一种编程语言,它有对象,模块,线程,异常处理和自动内存管理. 好处:开源.简洁.简单.方 ...
- under display camera
https://yzhouas.github.io/projects/UDC/udc.html https://zhuanlan.zhihu.com/p/389863230 MIPI 2022 Cha ...
- 2363. 合并相似的物品 (Easy)
问题描述 2363. 合并相似的物品 (Easy) 给你两个二维整数数组 items1 和 items2 ,表示两个物品集合.每个数组 items 有以下特质: items[i] = [valueᵢ, ...
- C++的mfc创建管道
注意:下面的东西是单管道 //创建管道 CString CDownDlg::CreateCmd(CString res) { CString wrCmd; CString ans = _T(" ...
- LaTex【五】latex导入中文包,支持中文显示
\documentclass{article} \usepackage{CJKutf8} \begin{document} \begin{CJK}{UTF8}{gbsn} 中文样例,UTF-8编码,字 ...
- Oracle查看异常未提交事务
1.查看归档日志都有哪些 SELECT * from v$archived_log 2.查看某个SCN号的归档文件是否存在 SELECT * from v$archived_log WHERE 113 ...
- kubernetes 报错The connection to the server localhost:8080 was refused - did you specify the right host or port?
The connection to the server localhost:8080 was refused - did you specify the right host or port? 环境 ...
- ESP8266_RTOS_SDK更新子模块出错git remote: [session-f0448081] 404 not found!
报错:git remote: [session-f0448081] 404 not found! 在.git文件夹中的config文件中找到子模块的地址,用浏览器打开发现确实没有对应的子模块仓库,这个 ...