反射原理和简介
我搜了搜,大多数的帖子对于反射的介绍都有过于白话和偏离中心的问题,这里推荐菜鸟教程对于反射的介绍https://www.runoob.com/csharp/csharp-reflection.html
C#代码示例
反射目标结构
namespace ReflectionDemoNameSpace
{
public class ReflectionMainClassBase
{
private int base_int = 10000;
public const string base_const_string = "Base_Const_String_ReflectionMainClassBase";
}
public class ReflectionMainClass : ReflectionMainClassBase
{
public struct StructReflection
{
public int int_struct_a;
public int int_struct_b;
public StructReflection(int a, int b)
{
int_struct_a = a;
int_struct_b = b;
}
}
public class ClassReflection
{
public string string_class_a;
public int int_class_a;
public ClassReflection(string a, int b)
{
string_class_a = a;
int_class_a = b;
}
}
private StructReflection structEntity;
private ClassReflection classEntity;
private int int_value = 10;
//属性
private int IntEntity
{
get
{
Debug.Log("Get IntEntity");
return int_value;
}
set
{
Debug.Log(string.Format("Set IntEntity value={0}", value));
int_value = value;
}
}
ReflectionMainClass()
{
structEntity = new StructReflection(1,2);
classEntity = new ClassReflection("a", 3);
Debug.Log("No Args Constructor Invoke");
}
ReflectionMainClass(StructReflection a, ClassReflection b)
{
structEntity = a;
classEntity = b;
Debug.Log("Two Args Constructor Invoke");
}
//私密函数
void PrivateMethod()
{
Debug.Log("Invoke PrivateMethod");
}
//公开函数
public void publicMethod()
{
Debug.Log("Invoke publicMethod");
}
//带参函数
public void HaveArgsMethod(StructReflection a, ClassReflection b)
{
Debug.Log("Invoke HaveArgsMethod");
structEntity = a;
classEntity = b;
}
//公开静态函数
public static void PublicStaticMethod()
{
Debug.Log("Invoke PublicStaticMethod");
}
//私密静态函数
static void PrivateStaticMethod()
{
Debug.Log("Invoke PrivateStaticMethod");
}
//重载函数 int a, int b
public void HeavyLoadMethod(int a, int b)
{
Debug.Log(string.Format("Invoke HeavyLoadMethod1, a:{0}, b:{1}", a, b));
}
//重载函数 string a, string b
public void HeavyLoadMethod(string a, string b)
{
Debug.Log(string.Format("Invoke HeavyLoadMethod2, a:{0}, b:{1}", a, b));
}
//重载函数 int a
public void HeavyLoadMethod(int a)
{
Debug.Log(string.Format("Invoke HeavyLoadMethod3, a:{0}", a));
}
}
}
反射测试代码
public class ReflectionDemo : MonoBehaviour
{
private void Awake()
{
//程序集反射主类型
Assembly assembly = Assembly.Load("Share");
Type main_type = assembly.GetType("ReflectionDemoNameSpace.ReflectionMainClass", true, true);
//获取类型中嵌套类型和结构体类型
Type struct_type = main_type.GetNestedType("StructReflection");
Type class_type = main_type.GetNestedType("ClassReflection");
/*
* 通过无参构造生成实例
*/
ConstructorInfo no_args_constructor =
main_type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { }, null);
object no_args_entity = no_args_constructor.Invoke(null);
/*
* 通过两参构造生成实例
*/
ConstructorInfo two_args_constructor = main_type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance,
null, new Type[] {struct_type, class_type}, null);
object struct_arg_entity = Activator.CreateInstance(struct_type, new object[] {100, 100});
object class_arg_entity = Activator.CreateInstance(class_type, new object[] {"s200", 300});
object two_args_entity = two_args_constructor.Invoke(new object[] {struct_arg_entity, class_arg_entity});
/*
* 通过Activator直接生成实例
*/
object activator_no_args_create_entity = Activator.CreateInstance(main_type, true);
object activator_two_args_create_entity = Activator.CreateInstance(main_type,
BindingFlags.NonPublic | BindingFlags.Instance,
default(Binder),
new object[] {struct_arg_entity, class_arg_entity},
default(CultureInfo));
/*
* 获取父类的静态字段: base_const_string, 因为是静态值,所以GetValue时不需要传入实例
*/
FieldInfo base_const_string_field_info = main_type.BaseType.GetField("base_const_string", BindingFlags.Static | BindingFlags.Public);
string base_const_string_value = base_const_string_field_info.GetValue(null).ToString();
/*
* 获取父类的字段: base_int,因为不是静态值,所以GetValue时需要传入实例
*/
FieldInfo base_int_field_info = main_type.BaseType.GetField("base_int", BindingFlags.NonPublic | BindingFlags.Instance);
int base_int_value = (int)base_int_field_info.GetValue(activator_no_args_create_entity);
/*
* 获取类中字段: int_value
*/
FieldInfo int_value_field_info = main_type.GetField("int_value", BindingFlags.NonPublic | BindingFlags.Instance);
int int_value = (int)int_value_field_info.GetValue(activator_no_args_create_entity);
/*
* 获取类中字段: structEntity,并且获取该entity内字段值
* 既可以使用上面获取到的struct_type,也可以通过struct_entity_value.GetType()来反射字段
*/
FieldInfo struct_entity_field_info = main_type.GetField("structEntity", BindingFlags.NonPublic | BindingFlags.Instance);
object struct_entity_value = struct_entity_field_info.GetValue(activator_no_args_create_entity);
FieldInfo struct_entity_int_struct_a = struct_type.GetField("int_struct_a");
int int_struct_a_value = (int)struct_entity_int_struct_a.GetValue(struct_entity_value);
FieldInfo struct_entity_int_struct_b = struct_type.GetField("int_struct_b");
int int_struct_b_value = (int)struct_entity_int_struct_b.GetValue(struct_entity_value);
/*
* 获取类中字段: classEntity,并且获取该entity内字段值
* 既可以使用上面获取到的class_type,也可以通过class_entity_value.GetType()来反射字段
*/
FieldInfo class_entity_field_info = main_type.GetField("classEntity", BindingFlags.NonPublic | BindingFlags.Instance);
object class_entity_value = class_entity_field_info.GetValue(activator_no_args_create_entity);
FieldInfo class_entity_string_class_a = class_type.GetField("string_class_a");
string string_class_a_value = (string)class_entity_string_class_a.GetValue(class_entity_value);
FieldInfo struct_entity_int_class_a = class_type.GetField("int_class_a");
int int_class_a_value = (int)struct_entity_int_class_a.GetValue(class_entity_value);
/*
* 获取类中属性: IntEntity
* 获取get值
* 设置Set值
*/
PropertyInfo property_IntEntity_info = main_type.GetProperty("IntEntity", BindingFlags.Instance | BindingFlags.NonPublic);
int property_IntEntity_get_value = (int)property_IntEntity_info.GetValue(activator_no_args_create_entity);
property_IntEntity_info.SetValue(activator_no_args_create_entity, 100000);
property_IntEntity_get_value = (int)property_IntEntity_info.GetValue(activator_no_args_create_entity);
/*
* 调用类中无参私密函数: PrivateMethod
*/
MethodInfo method_PrivateMethod_info = main_type.GetMethod("PrivateMethod", BindingFlags.NonPublic | BindingFlags.Instance);
method_PrivateMethod_info.Invoke(activator_no_args_create_entity, null);
/*
* 调用类中无参公开函数: publicMethod
*/
MethodInfo method_publicMethod_info = main_type.GetMethod("publicMethod");
method_publicMethod_info.Invoke(activator_no_args_create_entity, null);
/*
* 调用公开带参函数: HaveArgsMethod
* 需要创建创建参数的实例
*/
MethodInfo method_HaveArgsMethod_info = main_type.GetMethod("HaveArgsMethod", new Type[] {struct_type, class_type});
ConstructorInfo struct_construct_info = struct_type.GetConstructor(BindingFlags.Public | BindingFlags.Instance,
null,
new Type[] {typeof(int), typeof(int) },
null);
object new_struct_entity_object = struct_construct_info.Invoke(new object[]{1111,2222});
object new_class_entity_object = Activator.CreateInstance(class_type,
BindingFlags.Instance | BindingFlags.Public,
default(Binder),
new object[] {"ccccccc", 800},
default(CultureInfo));
method_HaveArgsMethod_info.Invoke(activator_no_args_create_entity, new object[] {new_struct_entity_object, new_class_entity_object});
/*
* 调用公开静态函数: PublicStaticMethod
* 需要创建创建参数的实例
*/
MethodInfo static_PublicStaticMethod_info = main_type.GetMethod("PublicStaticMethod", BindingFlags.Static | BindingFlags.Public);
static_PublicStaticMethod_info.Invoke(null, null);
/*
* 调用私密静态函数: PrivateStaticMethod
* 需要创建创建参数的实例
*/
MethodInfo static_PrivateStaticMethod_info = main_type.GetMethod("PrivateStaticMethod", BindingFlags.Static | BindingFlags.NonPublic);
static_PrivateStaticMethod_info.Invoke(null, null);
/*
* 调用重载函数: HeavyLoadMethod(int a, int b)
*/
MethodInfo method_HeavyLoadMethod1_info = main_type.GetMethod("HeavyLoadMethod",new Type[] {typeof(int), typeof(int)});
method_HeavyLoadMethod1_info.Invoke(activator_no_args_create_entity, new Object[] {10, 10});
/*
* 调用重载函数: HeavyLoadMethod(string a, string b)
*/
MethodInfo method_HeavyLoadMethod2_info = main_type.GetMethod("HeavyLoadMethod",new Type[] {typeof(string), typeof(string)});
method_HeavyLoadMethod2_info.Invoke(activator_no_args_create_entity, new Object[] {"aaa", "bbb"});
/*
* 调用重载函数: HeavyLoadMethod(int a)
*/
MethodInfo method_HeavyLoadMethod3_info = main_type.GetMethod("HeavyLoadMethod",new Type[] {typeof(int)});
method_HeavyLoadMethod3_info.Invoke(activator_no_args_create_entity, new Object[] {50000});
}
}