Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C#-特性、反射

C#-特性、反射

作者头像
祝你万事顺利
发布于 2019-05-28 05:39:51
发布于 2019-05-28 05:39:51
34500
代码可运行
举报
文章被收录于专栏:Unity游戏开发Unity游戏开发
运行总次数:0
代码可运行
特性

特性(conditional)是一个类 是一个继承了Attribute的类

给程序添加的声明性标签 .Net 提供了两种特性:预定义特性 自定义特性 预定义特性 : 三种 1.条件方法 : 只有在预编译指令和conditional的条件一样时,才会执行方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define AAA

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;


namespace 特性
{
    class Program
    {
        static void Main(string[] args)
        {
            myFun();
        }
        //预定义特性 
        //条件方法:使用Conditional添加条件
        [Conditional("AAA")]
        private static void myFun()
        {
            Console.WriteLine("特性AAA");
        }
    }
}

2.标记不被使用的程序体 此时调用此方法,也能用但是会有绿色波浪线,表示已过时

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        [Obsolete()]
        private static void OldFun()
        {
        }

此时就不能调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        [Obsolete("请使用新的方法", true)]
        private static void OldFun()
        {
        }

3.AttributeUsage特性用来限制自定义特性能用在什么地方 是否可以重复添加,此特性是否可以被继承

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[AttributeUsage(AttributeTargets.All,AllowMultiple = true,Inherited =true)]

自定义特性时,最后一个单词默认为Attribute,使用时会自动省略

5.想获得特性,需要用到反射

程序集

Assmbly类来加载程序集 通过Assmbly.Load() Assmbly.LoadFrom()等获取程序集的dll

反射

反射:审查程序集内部元数据的能力 1.三种通过反射获得Type对象的方法 1)通过Type的staticMethod GetType()方法,参数为目标类型的全名 2)通过对象的GetType函数获得 3)使用typeOf运算符获得,参数为目标类 2.创建对象:通过调用构造函数创建对象 1)通过反射创建对象,首先获得构造函数的ConstructorInfo对象,再通过Invoke创建对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            //2.创建对象:通过调用构造函数创建的对象
            //要通过反射创建对象,就得获取到Person的构造函数
            //获取到Person对象的所有公开构造函数
            ConstructorInfo[] cons = typeA.GetConstructors();
            //遍历cons获取单个构造函数的参数信息(个数、顺序、类型)
            foreach (var item in cons)
            {
                Console.WriteLine("有一个构造函数的参数信息全部被打印出来了");
                //获取单个构造函数的所有参数
                ParameterInfo[] paras = item.GetParameters();
                //遍历单个构造函数的所有参数数组
                for (int i = 0; i < paras.Length; i++)
                {
                    Console.WriteLine("第" + i + "个参数的类型为:" + paras[i].ParameterType);
                }
                Console.WriteLine("------------------------------------------------------");
            }
            //通过获取到的构造函数信息,获取单个构造函数
            Type[] types = { typeof(int) };
            //获取到的就是只有一个int类型参数的构造函数
            ConstructorInfo con = typeA.GetConstructor(types);
            //调用con创建Person对象
            object o = con.Invoke(new object[] { 15 });

3.通过反射获取字段 1)FieldInfo存储type对象的GetFields(); 2)MethofInfo获取对象的方法

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.04.26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C#反射的特性
如果您现在对反射还不太了解的话,那么可以先看看这篇博文,来粗略的了解一下反射吧。什么是反射
aehyok
2018/09/11
9780
C#反射的特性
C#反射与特性(四):实例化类型
前面三篇文章,介绍了使用程序集、获取 Type 类型、使用 Type 类型获取成员信息。
痴者工良
2021/04/26
1.3K0
.Net中的反射(反射特性) - Part.3
可能很多人还不了解特性,所以我们先了解一下什么是特性。想想看如果有一个消息系统,它存在这样一个方法,用来将一则短消息发送给某人:
张子阳
2018/09/30
5370
.Net中的反射(反射特性) - Part.3
C#反射与特性(九):全网最全-解析反射
C# 中的访问修饰符:public、private、protected、internal、protected internal。
痴者工良
2021/04/26
2.2K0
开心档之C# 特性(Attribute)
**特性(Attribute)**是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。
iOS Magician
2023/04/23
5000
C#反射与特性(七):自定义特性以及应用
【微信平台,此文仅授权《NCC 开源社区》订阅号发布】 本章的内容,主要是对属性和字段进行赋值和读值、自定义特性、将特性应用到实际场景。
痴者工良
2021/04/26
1.5K0
C#反射原理解析
需要using System.Reflection; Assembly的组成
bering
2019/12/03
1.2K0
浅谈.Net反射 9
假设我们在实现一个方法A,但是因为某种原因,这个方法A设计的不够好,我们需要重新设计一个方法B来代替方法A,因为很多客户程序中已经在使用旧版本的方法A了,如果简单地删除掉旧的方法A,使用老版本方法A的客户程序将无法工作,因此必须考虑兼容性。这个时候,我们应该同时保留A和B两个方法。那么我们会希望告知客户程序现在有一个全新的方法B可供使用,但此时客户程序并不知道已经存在一个新的方法B,那么又该如何做呢?
小蜜蜂
2019/07/30
5550
C#反射与特性(三):反射类型的成员
本篇文章中,将使用 Type 去获取成员信息,通过打印出反射获取到的信息,为后续操作反射打好基础。
痴者工良
2021/04/26
1.2K0
C#反射与特性(二):探究反射
在上一章中,我们探究了 C# 引入程序集的各种方法,这一章节笔者将探究 C# 中使用反射的各种操作和代码实践。
痴者工良
2021/04/26
1.7K0
C#基础知识回顾-- 反射(3)
获取Type对象的构造函数: 前一篇因为篇幅问题因为篇幅太短被移除首页,反射这一块还有一篇“怎样在程序集中使用反射”, 其他没有什么可以写的了,前两篇主要是铺垫,在实际应用中,主要是最后两篇。其实写完反射, 我也考虑重新把委托重新写下,现在想想确实太过单一和简单了。我会把实际开发中委托的例子多写几个 , 以便以理解。如果这几篇C#的基础对您有所帮助的话,请点击推荐。谢谢您的支持……   好了,不废话了,在前面例子中,由于MyClass类型的对象是显示创建的,因此使 用反射技术来调用MyClass上的方法
hbbliyong
2018/03/05
6690
C#基础知识回顾-- 反射(3)
.NET基础拾遗(4)委托、事件、反射与特性
  委托这个概念对C++程序员来说并不陌生,因为它和C++中的函数指针非常类似,很多码农也喜欢称委托为安全的函数指针。无论这一说法是否正确,委托的的确确实现了和函数指针类似的功能,那就是提供了程序回调指定方法的机制。
Edison Zhou
2018/08/20
1.1K0
.NET基础拾遗(4)委托、事件、反射与特性
C#进阶学习--反射(Reflection)
(1)Assembly:定义和加载程序集,加载在程序集中的所有模块以及从此程序集中查找类型并创建该类型的实例。
腾云大使
2022/01/13
1.5K0
C#之反射、元数据详解
  在本节中主要讲述自定义特性、反射。自定义特性允许把自定义元数据与程序元素关联起来。这些元数据是在编译过程中创建的,并嵌入程序集中。反射是一个普通的术语,它描述了在运行过程中检查和处理程序元素的功能。例如,反射运行完成以下任务:
小世界的野孩子
2019/09/11
1.6K0
C#中的方括号[](特性、属性)
首先要说的是,可能一些刚接触C#的朋友常常容易把属性(Property)跟特性(Attribute)弄混淆,其实这是两种不同的东西。属性就是面向对象思想里所说的封装在类里面的数据字段,其形式为:
vv彭
2020/12/28
8.3K0
C#中的方括号[](特性、属性)
C Sharp(十八)
很多程序语言中有元数据(matedata)的概念,其实元数据就是描述数据的数据。 一个运行的程序查看本身元数据或其他程序元数据的行为就叫做反射(reflection)。 要使用反射,我们必须引入 System.Reflection 命名空间。
1ess
2021/11/01
5760
C#反射
        Reflection,中文翻译为反射。         这是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型 (class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息,例如:         Assembly类可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。 Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。 MethodInfo包含方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。 诸如此类,还有FieldInfo、EventInfo等等,这些类都包含在System.Reflection命名空间下。
aehyok
2018/09/11
8850
C#基础知识回顾-- 反射(4)
从程序集获得类型   先说点题外话,现在技术真的发展太快了。我这边还很多东西半生不熟 呢,那边又出现了好多有趣的新东西让你眼红不已。学还是不学这还真是 个问题。Node.js 、bootstrap,我最近刚发现的新技术,其实他们已经 存在很久了,只是没有接触过而已。昨天晚上看Node.js一下子看到两点 多,感觉真是太有意思了^,有兴趣的可以去看看,大家多交流交流.   好了不废话了,在前面的示例中,几乎全部的MyClass信息都是通过反射得到的,但是有一个例外: MyClass类型本身。虽然前面的示例可以
hbbliyong
2018/03/05
6620
C#基础知识回顾-- 反射(4)
C#中的属性
属性在C#中很常用,但有部分开发人员对它既熟悉又陌生。概念上属性是将元数据关联到元素的方式。属性的使用方法我们在代码中经常肩见到,比如下面这样的:
喵叔
2021/12/22
2.4K0
C#基础知识学习之 ☀️ | 反射(Reflection) 的含义和用法
C# 反射(Reflection) 反射是.NET中的重要机制,通过反射可以得到*.exe或*.dll等程序集内部的接口、类、方法、字段、属性、特性等信息,还可以动态创建出类型实例并执行其中的方法。 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。 通过反射获取类型 描述
呆呆敲代码的小Y
2021/08/12
5.2K0
相关推荐
C#反射的特性
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验