C#反射(Reflection)简单实用

//*****************************************
/// <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 ()
    {

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值