c# 反射使用及详解

获取成员变量的方式有两种

typeof(T).GetPropertys(BindingFlags 参数) // 这中方式获取的成员变量一定要是实现了 get set 存储器的变量

typeof(T).GetFields(BindingFlags 参数) // 这种方式获取的成员变量不能实现 get set 。 否则获取不到成员变量。 

命名空间备注 :

BindingFlags 在 System.Reflection命名空间下

使用

typeof(T).GetPropertys (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); // 获取T 类的所有成员变量,包括公有与非公有

先写一个测试的类,有实现了get set 存储器的成员变量与没有实现get set 的成员变量

public class Class1

{
    string _className = string.Empty;

    string classNameGetSet{
        get{ 
            return _className;
        }
        set{ 
            _className = value;
        }
    }


    protected float _speed;


    private bool canMove{
        get{ 
            return true;
        }

        set{ }
    }

}


public class test : MonoBehavior{
    void Start(){

    Class1 c1 = new Class1 ();


    // 通过GetPropertys 获取到的成员变量
    var tProperty = typeof(Class1).GetProperties (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

    for(int i = 0;i < tProperty.Length;i++){
                Debug.Log ("name :[" + tProperty [i].Name + "]    value :[" + tProperty [i].GetValue (c1, null) + "]   type :[" + tProperty [i].PropertyType + "]");
            }


    // 通过GetFields 获取到的成员变量
    var field = typeof(Class1).GetFields (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
            for(int i = 0;i < field.Length;i++){
                Debug.Log ("name :[" + field [i].Name + "]  value :[" + field [i].GetValue (c1) + "]  type :[" + field [i].FieldType + "]");
            }

}
}

通过GetPropertys 获取到的成员变量。 可以看到,只获取到实现了 get set 存储器的成员变量。

这里写图片描述

通过GetFields 获取到的成员变量。 可以看到,只获取到没有实现 get set 的成员变量
这里写图片描述

通过反射还能获取到类的所有方法,调用类里的方法等。

其他使用方法参考以下链接
http://www.cnblogs.com/yaozhenfa/p/CSharp_Reflection_1.html 玩转反射

BindingFlags 枚举介绍
http://blog.csdn.net/qq_32452623/article/details/53401890

猜你喜欢

转载自blog.csdn.net/strivero/article/details/66480553
今日推荐