C#反射(Reflection)简单实用
2017-04-01 10:22
239 查看
//***************************************** /// <summary> /// General method.2017.../cyl /// </summary> ///***************************************** using UnityEngine; using System.Collections; using System.Reflection; using System; public class TestScriptReflection : MonoBehaviour { void Start () { // CallShowPrivate (); // CallShowLocalClass(); // CallShowStatic(); // CallShowDifferentiate(); // CallShowFiled(); // CallShowSetVlaue(); // CallShowSetValue2(); // CallShowSetValue3 (); CallShowSetValue4(); } void CallShowPublic () { Type t = typeof(RefClass); MemberInfo[] info = t.GetMembers ();//获取类中的公共成员 foreach (MemberInfo item in info) { Debug.Log (item.Name); } } void CallShowPrivate () { Type t = typeof(RefClass); MemberInfo[] info = t.GetMembers (BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); foreach (MemberInfo item in info) { Debug.Log (item.Name); } } void CallShowLocalClass () { Type t = typeof(RefClass); MemberInfo[] info = t.GetMembers (BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); foreach (MemberInfo item in info) { Debug.Log (item.Name); } } void CallShowStatic () { Type t = typeof(RefClass); MemberInfo[] info = t.GetMembers (BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public); foreach (MemberInfo item in info) { Debug.Log (item.Name); } } void CallShowDifferentiate () { Type t = typeof(RefClass); Func<MemberTypes,string> getType = (x) => { switch (x) { case MemberTypes.Field: return "字段"; break; case MemberTypes.Method: return "方法"; break; case MemberTypes.Property: return "属性"; break; default: { return "未知"; } } }; MemberInfo[] info = t.GetMembers (BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Static); foreach (MemberInfo item in info) { Debug.Log (item.Name + "类型: " + getType (item.MemberType)); } } void CallShowFiled () { Type t = typeof(RefClass); FieldInfo[] info = t.GetFields (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); foreach (FieldInfo item in info) { Debug.Log ("字段名称" + item.Name + "字段类型 :" + item.FieldType.ToString ()); } } void CallShowSetValue () { Type t = typeof(RefClass); RefClass rc = new RefClass (); rc.Test3 = 3;//属性进行了设置 FieldInfo[] info = t.GetFields (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); foreach (FieldInfo item in info) { Debug.Log ("字段名称: " + item.Name + "字段类型 :" + item.FieldType.ToString () + "rc中的值为 :" + item.GetValue (rc)); } } void CallShowSetValue2 () { Type t = typeof(RefClass); RefClass rc = new RefClass (); rc.Test3 = 30; FieldInfo[] info = t.GetFields (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); foreach (FieldInfo item in info) { item.SetValue (rc, 300);//进行属性赋值 Debug.Log ("字段名称:\t" + item.Name + "字段类型:\t" + "rc中的值:\t" + item.GetValue (rc)); } } void CallShowSetValue3 () { Type t = typeof(RefClass); RefClass rc = new RefClass (); rc.Test3 = 3; PropertyInfo[] finfos = t.GetProperties (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); foreach (PropertyInfo finfo in finfos) { MethodInfo getinfo = finfo.GetGetMethod (true); Debug.Log ("get方法的名称 "+getinfo.Name+"\t"+ "\t"+"返回值类型: "+getinfo.ReturnType.ToString ()+"\t"+ "参数数量: "+ "MSIL代码长度: "+getinfo.GetMethodBody ().GetILAsByteArray ().Length+"\t"+ "局部变量数量: "+getinfo.GetMethodBody ().LocalVariables.Count+"\t"); MethodInfo setinfo = finfo.GetSetMethod (true); Debug.Log ("get方法的名称 " +setinfo.Name+"\t"+ " 返回值类型: " + setinfo.ReturnType.ToString ()+"\t"+ "参数数量: " + "MSIL代码长度: " +setinfo.GetMethodBody ().GetILAsByteArray ().Length+"\t"+ "局部变量数量: "+setinfo.GetMethodBody ().LocalVariables.Count+"\t"); setinfo.Invoke (rc, new object[] { 123 }); object obj = getinfo.Invoke (rc, null); Debug.Log ("方法名: " +finfo.Name+"\t"+ "内部值: "+obj); } } void CallShowSetValue4() { Type t=typeof(ReFClass); ReFClass rc = new ReFClass (); // rc.Test3 = 30; MethodInfo[] info = t.GetMethods (BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.Instance|BindingFlags.DeclaredOnly|BindingFlags.Static); foreach (MethodInfo item in info) { //当前方法参数的个数 // print (item.GetParameters().Length); if (item.GetParameters().Length>0) { //当前方法参数第一个参数类型 // print(item.GetParameters()[0].ParameterType.ToString()); //判断类型是否相等 //item.GetParameters()[0].ParameterType.ToString().Equals(typeof(string)); //向当前方法输入参数,并返回结果 object obj=item.Invoke(rc,new []{"123456"}); //方法结果返回的类型 // print (item.ReturnType.ToString()); print(obj.ToString()); } /* MethodBody mboby = item.GetMethodBody (); print (item.Name); if (item.GetParameters().Length>0&&item.GetParameters()[0].ParameterType==typeof(string)) { object obj = item.Invoke (rc,new []{"123"}); MethodBody mboby = item.GetMethodBody (); string str = "拥有参数的方法名: " + item.Name + "\t" + "返回值类型: " + item.ReturnType.ToString () + "\t" + "参数1类型: " + item.GetParameters () [0].ParameterType.ToString () + "\t" + "参数1名称: " + item.GetParameters () [0].Name + "\t" + "方法调用后返回值: " + obj.ToString (); print (str); } */ } } } public class ReFClass { // private int _test3; // private int _test1{ set; get;} // protected int Test2{ set; get;} // public int Test3{ set; get;} private static void Show2(){ } public static string Show3(string s){ int a; int b; return s; } public string Show1(string s){ string a; return s; } } public class RefClass { private int _test3; private int _test1{ set; get; } protected int Test2{ set; get; } public int Test3{ set; get; } public void Show () { } public static void show2 () { } public static void show3 () { } }
相关文章推荐
- HTC封装,相对真实的进度条,简单实用。
- 改善编码风格(超级简单实用)
- 简单但还比较实用的模板技术
- DataGrid 导出 EXCEL(简单,实用)
- 简单实用的DataSet更新数据库的类+总结(转~给懒得写sp的人)
- 简单实用的DATAGRID组件
- 简单实用的c++快速排序模板类
- 简单实用的重写URL(URLRewriter.dll)
- 简单实用的DataSet更新数据库的类+总结(c#) 选择自 allen_21229 的 Blog
- 改善编码风格(超级简单实用)
- [网络基础]高效实用:用简单命令测试网络性能
- 一种简单实用的全屏方法
- 一个简单实用的遗传算法c程序(转载)
- [JS脚本][实用小软件]一个简单的汉字简体繁体转换工具源代码
- 一个简单实用的数据库操作框架
- 一个简单实用的数据库操作框架
- 逐段注释--最简单,最方便,最快速,最实用,最高效,最清晰,最直接,最好的调试方法
- struts 中文问题解决(简单实用)
- 一个简单实用的sql数据库查询工具(c#)
- 简单实用 Firefox最有用的20大插件热力推荐