您的位置:首页 > 编程语言 > C#

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

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c#