图解DotNet框架之五:System.Reflection

15 篇文章 0 订阅

(声明:本系列只想给大家介绍.net框架,并不是语法和类的使用的讲解,所以只能概括的描述一下所提到的类,如果有疑问可以到MSDN上面去查)      

 

这篇文章我们来学习System.Reflection,.net中反射的核心类.先来看图:

 

前面的文章,我们说过.net的元数据可以完整地描述类型,那么通过System.Reflection,可以在运行时发现类型格式,我们来看一下元数据:

 

源代码:

 

  class  Class2
        
{
            
            
private int x;
            
private int y;
            
public Class2(int a, int b)
            
{
                x 
= a;
                y 
= b;
            }

            
public int Add()
            
{
                
return x+y;
            }

        }

 

 

元数据,请看代码注释

 

TypeDef # 2  ( 02000003 )
//  -------------------------------------------------------
//      TypDefName: Class2  (02000003)
//      Flags     : [NestedPrivate] [AutoLayout] [Class] [AnsiClass] [BeforeFieldInit]  (00100003)
//      Extends   : 01000002 [TypeRef] System.Object
//      EnclosingClass : Test.Class1 (02000002)
//      Field #1 (04000004)
//      -------------------------------------------------------
//          Field Name: x (04000004)    // /字段名 
//          Flags     : [Private]  (00000001)   // 访问修饰
//          CallCnvntn: [FIELD]
//          Field type:  I4   // 字段类型
//  
//      Field #2 (04000005)
//      -------------------------------------------------------
//          Field Name: y (04000005)
//          Flags     : [Private]  (00000001)
//          CallCnvntn: [FIELD]
//          Field type:  I4
//  
//      Method #1 (06000004) 
//      -------------------------------------------------------
//          MethodName: .ctor (06000004)    // /构造函数
//          Flags     : [Public] [HideBySig] [ReuseSlot] [SpecialName] [RTSpecialName] [.ctor]  (00001886)   // 访问修饰
//          RVA       : 0x00002083
//          ImplFlags : [IL] [Managed]  (00000000)   // CLR 托管代码
//          CallCnvntn: [DEFAULT]
//          hasThis 
//          ReturnType: Void    // 返回类型
//          2 Arguments    
//              Argument #1:  I4   
//              Argument #2:  I4
//          2 Parameters    // 参数列表
//              (1) ParamToken : (08000003) Name : a flags: [none] (00000000)   // 参数类型
//              (2) ParamToken : (08000004) Name : b flags: [none] (00000000)
//  
//      Method #2 (06000005) 
//      -------------------------------------------------------
//          MethodName: Add (06000005) 方法名
//          Flags     : [Public] [HideBySig] [ReuseSlot]  (00000086)   // 访问修饰
//          RVA       : 0x00002099
//          ImplFlags : [IL] [Managed]  (00000000)
//          CallCnvntn: [DEFAULT]
//          hasThis 
//          ReturnType: I4   // 返回类型
//          No arguments.
//  

 

我们看到在元数据种非常详细的定义了一个类中的任何成员,还包括了程序集所引用的其他程序集的信息

 

AssemblyRef # 1  ( 23000001 )
//  -------------------------------------------------------
//      Token: 0x23000001
//      Public Key or Token: b7 7a 5c 56 19 34 e0 89 
//      Name: mscorlib
//      Version: 2.0.0.0
//      Major Version: 0x00000002
//      Minor Version: 0x00000000
//      Build Number: 0x00000000
//      Revision Number: 0x00000000
//      Locale: <null>
//      HashValue Blob:
//      Flags: [none] (00000000)
//  
//  

 

OK,了解了元数据,我们现在来看看上面图中,那些类的基本功能,.NetFrameWork库类的层次程序集包含模块,模块包含类型,类型又包含成员(方法,属性,字段,事件等)。

 

1.Assembly:主要是加载和操纵一个程序集.

2.ParameterInfo:该类保存给定参数的信息,也就是说方法的参数,可以用该类来操作.

3.Module:访问带有多文件程序集的给定模块,可以认为就是命名空间.

4.MemberInfo:该类是抽象基类,为他的子类定义了公共的行为.如MemberTypes,MemberName等.而他的子类则分别是方法,属性,字段,事件等信息的具体实现.

 

那么这些类如何来完成类型的反射呢?

 

 Assembly asm  =  Assembly.Load( " Test " ); // dll的名称
            Type t  =  asm.GetType( " Test.Class2 " ); // 类的完全命名
             object  obj  =  Activator.CreateInstance(t);  // 创建Class2的实例
            MethodInfo mi  =  t.GetMethod( " Add " ); // 获取Class2中Add方法的信息.
             string  s  =  ( string )mi.Invoke(obj, null ); // 执行方法,需要参数1:Class2的实例,2:方法的参数列表.
           
            FieldInfo pi 
=  t.GetField( " x " );  // 获取字段信息
            pi.GetValue(obj);  // 得到字段值

 

事件和属性的反射调用,同上述代码差不多,不再赘述.上面的代码中我们使用了Type这个类型,这里做一下简单的介绍

System.Type定义了大量的成员,可以用来检查一个类型的元数据,如GetMethod,GetFields等方法,基本上一个类型的所有信息都可以得到,很好很强大.呵呵.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在UE中,"UnrealBuildTool"是一个用于编译和构建项目的工具。根据引用和引用中的信息,"dotnet"命令无法正常运行,可能是因为没有正确配置DOTNET环境变量。您可以尝试以下步骤来解决此问题: 1. 检查DOTNET环境变量是否正确配置。根据引用中的信息,DOTNET_ROOT应该被设置为"C:\Program Files\Epic Games\UE_5.1\Engine\Binaries\ThirdParty\DotNet"。请确保该环境变量已正确设置,如果没有设置,请按照引用中提供的路径进行配置。 2. 确保您的系统上已安装了.NET Core SDK。您可以从Microsoft的官方网站上下载并安装最新版本的.NET Core SDK。 3. 如果您已经安装了.NET Core SDK并且DOTNET环境变量已正确配置,但问题仍然存在,请尝试重新安装UE,并确保在安装过程中选择了正确的选项和路径。 如果您在尝试上述步骤后仍然遇到问题,请参考UE的官方文档或向UE的社区寻求帮助,以获取更详细的指导和解决方案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [UE5.1.1 创建C++项目失败](https://blog.csdn.net/ldghd/article/details/131978868)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [UE5.1.1 C++ 环境问题解决](https://blog.csdn.net/qq_31329259/article/details/129754209)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值