• c# 反射专题研究


    反射提供描述程序集、模块和类型的对象(Type 类型)。 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后调用其方法或访问器字段和属性。 如果代码中使用了特性,可以利用反射来访问它们。 有关更多信息,请参阅特性

    1. /***
    2. * Title:"测试反射" 项目
    3. * 主题:人员信息
    4. * Description:
    5. * 功能:XXX
    6. * Date:2022
    7. * Version:0.1版本
    8. * Author:Coffee
    9. * Modify Recoder:
    10. */
    11. using System;
    12. using System.Collections.Generic;
    13. using System.Text;
    14. namespace Test_Reflection
    15. {
    16. class PeopleInfo
    17. {
    18. private string guid=Guid.NewGuid().ToString();
    19. public string desc= "人员信息";
    20. public string Id { get; set; }
    21. public string Name { get; set; }
    22. public string Sex { get; set; }
    23. public int Age { get; set; }
    24. public string Work { get; set; }
    25. public string WorkFlow(string opc)
    26. {
    27. //1、规划当天内容
    28. //2、设置当天内容的紧急程度
    29. //3、根据紧急情况进行处理
    30. //4、总结一天内容
    31. return $"工作流处理完成:{opc}";
    32. }
    33. public static string Test()
    34. {
    35. Console.WriteLine("这是一个测试");
    36. return "这是一个静态的方法执行完成";
    37. }
    38. public PeopleInfo()
    39. {
    40. }
    41. public PeopleInfo(string name,int age)
    42. {
    43. this.Name = name;
    44. this.Age = age;
    45. }
    46. }//Class_end
    47. }

    1. System.Type type = typeof(PeopleInfo);
    2. string str = string.Empty;
    3. str += $"1-对象类型名称:{type.Name + enterEffect}";
    4. str += $"2-对象类型的全名:{type.FullName + enterEffect}";
    5. str += $"3-对象类型的命名空间:{type.Namespace + enterEffect}";
    6. str += $"4-对象类型是否为抽象类型:{type.IsAbstract + enterEffect}";
    7. str += $"5-对象类型是否为数组:{type.IsArray + enterEffect}";
    8. str += $"6-对象类型是否为类:{type.IsClass + enterEffect}";
    9. str += $"7-对象类型是否为枚举:{type.IsEnum + enterEffect}";
    10. str += $"8-对象类型是否为接口:{type.IsInterface + enterEffect}";
    11. str += $"9-对象类型是否为公有:{type.IsPublic + enterEffect}";
    12. str += $"10-对象类型是否为密封类:{type.IsSealed + enterEffect}";
    13. str += $"11-对象类型是否为值类型:{type.IsValueType + enterEffect}";
    14. str += $"12-对象类型的基类类型:{type.BaseType + enterEffect}";
    15. str += $"13-对象类型的【程序集】字符串:{type.Assembly + enterEffect}";
    16. str += $"14-对象类型是否是COM对象:{type.IsCOMObject + enterEffect}";
    17. str += $"15-对象类型的【程序集.命名空间.类名】字符串:{type.AssemblyQualifiedName + enterEffect}";
    18. System.Reflection.MemberInfo[] type1 = type.GetMember("PeopleInfo");
    19. if (type1!=null )
    20. {
    21. foreach (var item in type1)
    22. {
    23. str += $"成员信息:{item.Name + enterEffect}";
    24. }
    25. }
    26. ShowInfo(str);

    1. PeopleInfo peopleInfo = new PeopleInfo();
    2. peopleInfo.Id = "CK00988";
    3. peopleInfo.Name = "张一山";
    4. peopleInfo.Sex = "男";
    5. peopleInfo.Age = 23;
    6. peopleInfo.Work = "信息部总监";
    7. System.Type type1 = peopleInfo.GetType();
    8. System.Type type2 = peopleInfo.Age.GetType();
    9. string str = string.Empty;
    10. System.Reflection.MemberInfo[] type3 = type1.GetMember("Name");
    11. if (type3 != null)
    12. {
    13. foreach (var item in type3)
    14. {
    15. str += $"成员名称:{item.Name} 类型:{item.MemberType} 声明此成员的类为:{item.DeclaringType} {enterEffect}";
    16. }
    17. }
    18. System.Reflection.MemberInfo[] type4 = type1.GetMembers();
    19. if (type4 != null)
    20. {
    21. foreach (var item in type4)
    22. {
    23. str += $"成员名称:{item.Name} 类型:{item.MemberType} 声明此成员的类为:{item.DeclaringType} {enterEffect}";
    24. }
    25. }
    26. System.Reflection.ConstructorInfo[] ci = type1.GetConstructors();
    27. if (ci != null)
    28. {
    29. foreach (var item in ci)
    30. {
    31. str += $"构造成员名称:{item.Name} 类型:{item.MemberType} 声明此成员的类为:{item.DeclaringType} 模块:{item.Module} {enterEffect}";
    32. System.Reflection.ParameterInfo[] pi111 = item.GetParameters();
    33. if (pi111 != null)
    34. {
    35. for (int i = 0; i < pi111.Length; i++)
    36. {
    37. str += $"参数{i}是:{pi111[i]} {enterEffect}";
    38. }
    39. }
    40. }
    41. str += enterEffect;
    42. }
    43. System.Type type = System.Type.GetType("Test_Reflection.PeopleInfo");
    44. //通过无参构造创建实例
    45. object obj = Activator.CreateInstance(type);
    46. //将对象转为PeopleInfo类
    47. PeopleInfo peopleInfo1 = obj as PeopleInfo;
    48. str += $"描述1:{peopleInfo1.desc} 名称1:{peopleInfo1.Name} 年龄1:{peopleInfo1.Age}{enterEffect}";
    49. System.Type type111 = typeof(PeopleInfo);
    50. //通过有参构造创建实例
    51. dynamic obj2 = Activator.CreateInstance(type111, System.Reflection.BindingFlags.Instance|
    52. System.Reflection.BindingFlags.Public,null,new object[] {"卓一航",26},null);
    53. str += $"描述2:{obj2.desc} 名称2:{obj2.Name} 年龄2:{obj2.Age}{enterEffect}";
    54. System.Reflection.EventInfo[] eventInfo = type1.GetEvents();
    55. if (eventInfo!=null)
    56. {
    57. foreach (var item in eventInfo)
    58. {
    59. str += $"事件名称:{item.Name} 类型:{item.EventHandlerType} 声明此成员的类为:{item.DeclaringType} 模块:{item.Module} {enterEffect}";
    60. }
    61. }
    62. System.Reflection.FieldInfo fi2 = type1.GetField("desc",System.Reflection.BindingFlags.Instance|System.Reflection.BindingFlags.Public);
    63. str += $"修改前字段的值:{fi2.GetValue(peopleInfo)} {enterEffect}";
    64. fi2.SetValue(peopleInfo,"修改后的值");
    65. str += $"修改后字段的值:{fi2.GetValue(peopleInfo)} {enterEffect}";
    66. System.Reflection.FieldInfo[] fi = type1.GetFields(System.Reflection.BindingFlags.Instance |
    67. System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public);
    68. if (fi != null)
    69. {
    70. foreach (var item in fi)
    71. {
    72. str += $"字段名称:{item.Name} 类型:{item.FieldType} 声明此成员的类为:{item.DeclaringType} 模块:{item.Module} 值:{item.GetValue(peopleInfo)} {enterEffect}";
    73. }
    74. }
    75. System.Reflection.PropertyInfo[] pi = type1.GetProperties();
    76. if (pi != null)
    77. {
    78. foreach (var item in pi)
    79. {
    80. str += $"属性名称:{item.Name} 类型:{item.MemberType} 声明此成员的类为:{item.DeclaringType} 模块:{item.Module} {enterEffect}";
    81. }
    82. }
    83. System.Reflection.MethodInfo[] mi = type1.GetMethods(System.Reflection.BindingFlags.Instance| System.Reflection.BindingFlags.NonPublic
    84. );
    85. if (mi != null)
    86. {
    87. foreach (var item in mi)
    88. {
    89. str += $"方法名称:{item.Name} 类型:{item.MemberType} 声明此成员的类为:{item.DeclaringType} 模块:{item.Module} {enterEffect}";
    90. }
    91. }
    92. //反射调用方法一
    93. string result = (string)type.InvokeMember("WorkFlow", System.Reflection.BindingFlags.InvokeMethod |
    94. System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance,
    95. null, obj, new object[] { "测试传入的参数11111" });
    96. str += $"反射调用方法一:{result} {enterEffect}";
    97. //反射调用方法二
    98. System.Reflection.MethodInfo mi222 =type.GetMethod("WorkFlow",
    99. System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance
    100. | BindingFlags.IgnoreCase);
    101. string result2 = (string)mi222.Invoke(obj,new object[] {"测试传入的参数22222" });
    102. str += $"反射调用方法二:{result2} {enterEffect}";
    103. //反射调用方法三
    104. System.Reflection.MethodInfo mi333 = type.GetMethod("Test");
    105. string result3 = (string)mi333.Invoke(null,null);
    106. str += $"反射调用静态方法:{result3} {enterEffect}";
    107. ShowInfo(str);

    1. System.Type type = System.Type.GetType("Test_Reflection.PeopleInfo");
    2. ShowInfo(type);

    1. var a = new PeopleInfo("wocao", 45);
    2. var props = a.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
    3. foreach (var prop in props)
    4. {
    5. object value = prop.GetValue(a);
    6. var ddsaf = prop.Name;
    7. }

    链接:示例项目
    提取码:5zzk 

    msdn-反射官方文档

  • 相关阅读:
    第一章 Bash 入门
    传输层两大战将TCP、UDP的定位
    刷代码随想录有感(66):回溯算法——组合问题的优化(剪枝)
    Apache DolphinScheduler 4月简报:社区发展与技术革新速递
    dubbo 问题整理
    Vuex--模块化+命名空间
    Outlook如何删除邮箱账户
    ansible批量添加巡检服务器
    4. Java程序控制结构
    操作系统:进程的创建(fork函数)、进程的替换(exec函数)
  • 原文地址:https://blog.csdn.net/xujianjun229/article/details/126192334