反射原理和簡(jiǎn)介
我搜了搜,大多數(shù)的帖子對(duì)于反射的介紹都有過于白話和偏離中心的問題,這里推薦菜鳥教程對(duì)于反射的介紹https://www.runoob.com/csharp/csharp-reflection.html
C#代碼示例
反射目標(biāo)結(jié)構(gòu)
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");
}
//私密函數(shù)
void PrivateMethod()
{
Debug.Log("Invoke PrivateMethod");
}
//公開函數(shù)
public void publicMethod()
{
Debug.Log("Invoke publicMethod");
}
//帶參函數(shù)
public void HaveArgsMethod(StructReflection a, ClassReflection b)
{
Debug.Log("Invoke HaveArgsMethod");
structEntity = a;
classEntity = b;
}
//公開靜態(tài)函數(shù)
public static void PublicStaticMethod()
{
Debug.Log("Invoke PublicStaticMethod");
}
//私密靜態(tài)函數(shù)
static void PrivateStaticMethod()
{
Debug.Log("Invoke PrivateStaticMethod");
}
//重載函數(shù) int a, int b
public void HeavyLoadMethod(int a, int b)
{
Debug.Log(string.Format("Invoke HeavyLoadMethod1, a:{0}, b:{1}", a, b));
}
//重載函數(shù) string a, string b
public void HeavyLoadMethod(string a, string b)
{
Debug.Log(string.Format("Invoke HeavyLoadMethod2, a:{0}, b:{1}", a, b));
}
//重載函數(shù) int a
public void HeavyLoadMethod(int a)
{
Debug.Log(string.Format("Invoke HeavyLoadMethod3, a:{0}", a));
}
}
}
反射測(cè)試代碼
public class ReflectionDemo : MonoBehaviour
{
private void Awake()
{
//程序集反射主類型
Assembly assembly = Assembly.Load("Share");
Type main_type = assembly.GetType("ReflectionDemoNameSpace.ReflectionMainClass", true, true);
//獲取類型中嵌套類型和結(jié)構(gòu)體類型
Type struct_type = main_type.GetNestedType("StructReflection");
Type class_type = main_type.GetNestedType("ClassReflection");
/*
* 通過無參構(gòu)造生成實(shí)例
*/
ConstructorInfo no_args_constructor =
main_type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { }, null);
object no_args_entity = no_args_constructor.Invoke(null);
/*
* 通過兩參構(gòu)造生成實(shí)例
*/
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直接生成實(shí)例
*/
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));
/*
* 獲取父類的靜態(tài)字段: base_const_string, 因?yàn)槭庆o態(tài)值,所以GetValue時(shí)不需要傳入實(shí)例
*/
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,因?yàn)椴皇庆o態(tài)值,所以GetValue時(shí)需要傳入實(shí)例
*/
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內(nèi)字段值
* 既可以使用上面獲取到的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內(nèi)字段值
* 既可以使用上面獲取到的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值
* 設(shè)置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);
/*
* 調(diào)用類中無參私密函數(shù): PrivateMethod
*/
MethodInfo method_PrivateMethod_info = main_type.GetMethod("PrivateMethod", BindingFlags.NonPublic | BindingFlags.Instance);
method_PrivateMethod_info.Invoke(activator_no_args_create_entity, null);
/*
* 調(diào)用類中無參公開函數(shù): publicMethod
*/
MethodInfo method_publicMethod_info = main_type.GetMethod("publicMethod");
method_publicMethod_info.Invoke(activator_no_args_create_entity, null);
/*
* 調(diào)用公開帶參函數(shù): HaveArgsMethod
* 需要?jiǎng)?chuàng)建創(chuàng)建參數(shù)的實(shí)例
*/
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});
/*
* 調(diào)用公開靜態(tài)函數(shù): PublicStaticMethod
* 需要?jiǎng)?chuàng)建創(chuàng)建參數(shù)的實(shí)例
*/
MethodInfo static_PublicStaticMethod_info = main_type.GetMethod("PublicStaticMethod", BindingFlags.Static | BindingFlags.Public);
static_PublicStaticMethod_info.Invoke(null, null);
/*
* 調(diào)用私密靜態(tài)函數(shù): PrivateStaticMethod
* 需要?jiǎng)?chuàng)建創(chuàng)建參數(shù)的實(shí)例
*/
MethodInfo static_PrivateStaticMethod_info = main_type.GetMethod("PrivateStaticMethod", BindingFlags.Static | BindingFlags.NonPublic);
static_PrivateStaticMethod_info.Invoke(null, null);
/*
* 調(diào)用重載函數(shù): 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});
/*
* 調(diào)用重載函數(shù): 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"});
/*
* 調(diào)用重載函數(shù): 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});
}
}