首页 > 编程语言 >C# 反射

C# 反射

时间:2023-06-07 14:48:48浏览次数:20  
标签:dbi 反射 Console string C# DeBugInfo WriteLine public

定义:

反射指程序可以访问、检测和修改它本身状态或行为的一种能力。

程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。

您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。

优点:

1、反射提高了程序的灵活性和扩展性。

2、降低耦合性,提高自适应能力。

3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类

缺点:

1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。

2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。

用途:

  • 它允许在运行时查看特性(attribute)信息。
  • 它允许审查集合中的各种类型,以及实例化这些类型。
  • 它允许延迟绑定的方法和属性(property)。
  • 它允许在运行时创建新类型,然后使用这些类型执行一些任务

示例代码:

using System;
using System.Reflection;
namespace BugFixApplication
{
   // 一个自定义特性 BugFix 被赋给类及其成员
   [AttributeUsage(AttributeTargets.Class |
   AttributeTargets.Constructor |
   AttributeTargets.Field |
   AttributeTargets.Method |
   AttributeTargets.Property,
   AllowMultiple = true)]

   public class DeBugInfo : System.Attribute
   {
      private int bugNo;
      private string developer;
      private string lastReview;
      public string message;

      public DeBugInfo(int bg, string dev, string d)
      {
         this.bugNo = bg;
         this.developer = dev;
         this.lastReview = d;
      }

      public int BugNo
      {
         get
         {
            return bugNo;
         }
      }
      public string Developer
      {
         get
         {
            return developer;
         }
      }
      public string LastReview
      {
         get
         {
            return lastReview;
         }
      }
      public string Message
      {
         get
         {
            return message;
         }
         set
         {
            message = value;
         }
      }
   }
   [DeBugInfo(45, "Zara Ali", "12/8/2012",
        Message = "Return type mismatch")]
   [DeBugInfo(49, "Nuha Ali", "10/10/2012",
        Message = "Unused variable")]
   class Rectangle
   {
      // 成员变量
      protected double length;
      protected double width;
      public Rectangle(double l, double w)
      {
         length = l;
         width = w;
      }
      [DeBugInfo(55, "Zara Ali", "19/10/2012",
           Message = "Return type mismatch")]
      public double GetArea()
      {
         return length * width;
      }
      [DeBugInfo(56, "Zara Ali", "19/10/2012")]
      public void Display()
      {
         Console.WriteLine("Length: {0}", length);
         Console.WriteLine("Width: {0}", width);
         Console.WriteLine("Area: {0}", GetArea());
      }
   }//end class Rectangle  
   
   class ExecuteRectangle
   {
      static void Main(string[] args)
      {
         Rectangle r = new Rectangle(4.5, 7.5);
         r.Display();
         Type type = typeof(Rectangle);
         // 遍历 Rectangle 类的特性
         foreach (Object attributes in type.GetCustomAttributes(false))
         {
            DeBugInfo dbi = (DeBugInfo)attributes;
            if (null != dbi)
            {
               Console.WriteLine("Bug no: {0}", dbi.BugNo);
               Console.WriteLine("Developer: {0}", dbi.Developer);
               Console.WriteLine("Last Reviewed: {0}",
                                        dbi.LastReview);
               Console.WriteLine("Remarks: {0}", dbi.Message);
            }
         }
         
         // 遍历方法特性
         foreach (MethodInfo m in type.GetMethods())
         {
            foreach (Attribute a in m.GetCustomAttributes(true))
            {
               DeBugInfo dbi = (DeBugInfo)a;
               if (null != dbi)
               {
                  Console.WriteLine("Bug no: {0}, for Method: {1}",
                                                dbi.BugNo, m.Name);
                  Console.WriteLine("Developer: {0}", dbi.Developer);
                  Console.WriteLine("Last Reviewed: {0}",
                                                dbi.LastReview);
                  Console.WriteLine("Remarks: {0}", dbi.Message);
               }
            }
         }
         Console.ReadLine();
      }
   }
}

标签:dbi,反射,Console,string,C#,DeBugInfo,WriteLine,public
From: https://www.cnblogs.com/KevinSteven/p/17463217.html

相关文章

  • Vue3 之 响应式 API reactive、 effect源码,详细注释
    Vue3之响应式APIreactive、effect源码,详细注释目录一.实现响应式API:reactive、shallowReactive、readonly、shallowReadonly1.针对不同的API创建不同的响应式对象2.实现createReactiveObject3.实现不同的拦截函数baseHandlers.ts二.实现响应式effect1.创建响应式的......
  • sudo: unable to resolve host localhost: Temporary failure in name resolution
    Ubuntu环境,假设这台机器名字叫abc(机器的hostname),每次执行sudo就出现这个警告讯息:sudo:unabletoresolvehostabc虽然sudo还是可以正常执行,但是警告讯息每次都出来,而这只是机器在反解上的问题,所以就直接从/etc/hosts设定,让abc(hostname)可以解回127.0.0.1的......
  • blockMesh绘制圆柱网格
    blockMeshDict文件的内容如下:/*--------------------------------*-C++-*----------------------------------*\|=========|||\\/Field|OpenFOAM:TheOpenSourceCFDToolbox......
  • CodeGeeX 2.0版本重大升级:通过聊天对话的方式直接操作代码
    CodeGeeX2.0版本正式上线!从命名上看这是一次大版本的升级。上个月,CodeGeeX在VSCode和JetBrainsIDEs的插件中,加入了智能问答(AskCodeGeeX)功能,让用户可以在IDE中通过问答对话的方式解决技术问题。本周,这一功能全新升级!在CodeGeeX2.0正式版中,将问答与IDE编程环境深度融合,可以通过......
  • asp.net里cookie、session进一步理解
    参照:session+cookie简单讲解以及持久化登录实现_session实现用户登录_AkagiSenpai的博客-CSDN博客sessionID和cookie-哈哈呵h-博客园(cnblogs.com)概念介绍cookie——是http无状态特性的补充,是在客户端保持状态的方案,以key/value的形式进行保存。网站经常使用这个技术来......
  • Nginx Location 基本配置
    基本语法格式:Locationblock的基本语法形式是:  location[=|~|~*|^~|@]pattern{...}[=|~|~*|^~|@]被称作locationmodifier,这会定义Nginx如何去匹配其后的pattern,以及该pattern的最基本的属性(简单字符串或正则表达式)location的匹配符1.等于匹配符:=......
  • iPhone 卡死 重启 panic full
    {"bug_type":"210","timestamp":"2023-06-0712:41:42.00+0800","os_version":"iPhoneOS16.3.1(20D67)","roots_installed":0,"incident_id":"3FAEF701-289A-4ECD-AC5E-4109037B5B......
  • VMware ESXi 6.7 U3 Final Unlocker & OEM BIOS 集成 REALTEK 网卡驱动和 NVMe 驱动 (
    VMwareESXi6.7U3Final最终版,集成驱动版。此版本解决的问题:VMwareHostClient无法将现有虚拟磁盘(VMDK)附加到虚拟机请访问原文链接:https://sysin.org/blog/vmware-esxi-6-sysin/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org2023-02-28,发布一个UIfix版......
  • extendscript
    //获取当前活动序列varactiveSequence=app.project.activeSequence;//获取视频轨道和标签的位置varvideoTrack=activeSequence.videoTracks[0];//假设视频位于第一个视频轨道varmarker1=activeSequence.markers[0];varmarker2=activeSequence.markers[1];//......
  • kratos中使用etcdWatch介绍
    项目地址https://gitee.com/huoyingwhw/kratos_etcd_watch使用原生的etcdAPI的测试 packagetestsimport("context""fmt""github.com/stretchr/testify/require"clientv3"go.etcd.io/etcd/client/v3""tes......