//*****************************************
/// <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 ()
{
}
}
C#反射(Reflection)简单实用
最新推荐文章于 2022-02-24 16:41:43 发布