使用c#特性,给方法或类打自定义标签再反射获取
给方法打自定义标签再反射获取
1.自定义特性类
using System;
using System.Collections;
using System.Collections.Generic; /// <summary>
/// 自定义新特性
/// </summary>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class CustomA : Attribute { }
2.获取
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine; public class MyTest : MonoBehaviour { // Use this for initialization
void Start () {
//反射自己这类
Type t = GetType();
//拿去本类的方法
MethodInfo[] _method = t.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
for (int i = ; i < _method.Length; i++)
{
System.Object[] _attrs = _method[i].GetCustomAttributes(typeof(CustomA), false); //反射获得用户自定义属性
var count = _attrs.Length;
for (int j = ; j < _attrs.Length; j++)
{
if (_attrs[j] is CustomA)
{
Debug.Log("被注册的方法为:" + _method[i].Name);
}
}
}
} // Update is called once per frame
void Update () { } [CustomA]
public void MySimpleMethod()
{ }
}
================================================================================================================================================================================================
【给类打上标签】获得相对于打上标签的类
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine; public class Test1 : MonoBehaviour { // Use this for initialization
void Start () {
//获取程序集
Assembly assembly = this.GetType().Assembly;
//得到程序集的显示名称
//Debug.Log(assembly.FullName);
//通过程序集 得到程序集中的所有的类
Type[] types = assembly.GetTypes();
//遍历类
foreach (Type item in types)
{
//获得打上CustomA标签的类(已设置 AttributeTargets.All)
System.Object[] _attrs = item.GetCustomAttributes(typeof(CustomA), false); //反射获得用户自定义属性
foreach (var it in _attrs)
{
if (it is CustomA)
{
Debug.Log("得到" + item.Name);
}
}
} //打印所有类
foreach (var type in types)
{
Debug.Log(type.Name);
}
} // Update is called once per frame
void Update () { }
}
【打标签的类】
using System.Collections;
using System.Collections.Generic;
using UnityEngine; [CustomA]
public class Test2 : MonoBehaviour { // Use this for initialization
void Start () { } // Update is called once per frame
void Update () { }
}
简写
//获得当前类的程序集
Assembly x = this.GetType().Assembly;
//获取此程序集中的所有类
Type[] allClass = x.GetTypes();
//遍历操作
foreach (Type oneClass in allClass)
{
//获取类的attribute
var attribute = oneClass.GetCustomAttribute<NetworkMsg>();
//判断attribute是否为NetworkMsg
if (attribute is NetworkMsg)
{
Debug.Log(oneClass.Name);
}
}
使用c#特性,给方法或类打自定义标签再反射获取的更多相关文章
- java通过反射获取调用变量以及方法
一:反射概念 可以通过Class类获取某个类的成员变量以及方法,并且调用之. 二:通过反射获取方法.变量.构造方法 @Test // 通过反射获取类定义的方法 public void testMeth ...
- C#反射 获取程序集信息和通过类名创建类实例(转载)
C#反射获取程序集信息和通过类名创建类实例 . System.Reflection 命名空间:包含通过检查托管代码中程序集.模块.成员.参数和其他实体的元数据来检索其相关信息的类型. Assembly ...
- 通过反射获取及调用方法(Method)
1.获取方法使用反射获取某一个类中的方法,步骤:①找到获取方法所在类的字节码对象②找到需要被获取的方法 Class类中常用方法: public Method[] getMethods():获取包括自身 ...
- .NET C#利用反射获取类文件以及其中的方法&属性 并获取类及方法上的特性
了解C#特性类并声明我们自己的特性类[AttributeTest]代码如下 using System; namespace AttributeTest { /* 特性说明 特性本质是一个继承和使用了系 ...
- Java SE学习笔记 --->高级类特性 ---> toString() 方法
概述: toString() 方法在面向对象当中十分常见,使用频率很高,和equals() 方法一样,也是Object类中定义的方法. jdk中 源码: java.lang.Object类中ToStr ...
- [C#]Attribute特性(2)——方法的特性及特性参数
上篇博文[C#]Attribute特性介绍了特性的定义,类的特性,字段的特性,这篇博文将介绍方法的特性及特性参数相关概念. 3.方法的特性 之所以将这部分单列出来进行讨论,是因为对方法的特性查询的反射 ...
- Android开发中,那些让您觉得相见恨晚的方法、类或接口
Android开发中,那些让你觉得相见恨晚的方法.类或接口本篇文章内容提取自知乎Android开发中,有哪些让你觉得相见恨晚的方法.类或接口?,其实有一部是JAVA的,但是在android开发中也算常 ...
- 如何在方法上贴上attribute(特性)捕捉方法的异常,来实现我们的需求
在方法上贴上attribute(特性)捕捉方法的异常,其实这么做也是为了在项目中不会大量使用try-cacth这样的语句,同时使我们的代码看起来更简洁,更直观,将逻辑业务分离使得后期维护方便.这里我们 ...
- 【前端基础系列】slice方法将类数组转换数组实现原理
问题描述 在日常编码中会遇到将类数组对象转换为数组的问题,其中常用到的一种方式使用Array.prototype.slice()方法. 类数组对象 所谓的类数组对象,JavaScript对它们定义为: ...
随机推荐
- CSS与jQuery补漏
1.position属性 这个属性定义建立元素布局所用的定位机制.任何元素都可以定位,不过绝对或固定元素会生成一个块级框,而不论该元素本身是什么类型.相对定位元素会相对于它在正常流中的默认位置偏移. ...
- Replication--使用备份初始化订阅--推送订阅
1. 修改发布属性"许从备份文件初始化"置为TRUE2. 备份数据库并在订阅服务器上还原3. 创建订阅 -------------------------------------- ...
- JulyNovel-React
写在前面的话 目前,JulyNovel后端框架基本搭建.部署完毕,GraphQL提供的API接口也有着高可用性,数据库里也存了六七百兆爬来的小说数据,是时候开始写前端了. 框架选用 JulyNovel ...
- JAVA程序对MYSQL数据库加锁实验
什么是脏读,不可重复读,幻读 1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据. 2. 不可重 ...
- 二十六、Nodejs 操作 MongoDb 数据库
一. 在 Nodejs 中使用 Mongodb 前面的课程我们讲了用命令操作 MongoDB,这里我们看下如何用 nodejs 来操作数据库需要引包: npm install mongodb --sa ...
- KVM虚拟化之windows虚拟机性能调整
通过KVM安装WindowsXP/2003/7/2008操作系统后,由于默认的磁盘驱动(IDE)性能与网卡驱动(RTL8139100M)的性能都极其低下,需要调整,通过加载Redhatvirtio驱动 ...
- 【maven】---初识
前言 最近在研究自动化测试,其中的一个研究点儿就是maven,去download了一本书,看了看.下面是自己的从书中摘录的一些关于maven的概念性的东西. 内容 maven是什么? Maven是一个 ...
- threading.local()方法;线程池
一,threading.local() import time import threading v = threading.local() def func(arg): # 内部会为当前线程创建一个 ...
- nginx处理高并发请求强于apache
ginx 不同于 Apache2 的一点就是,Nginx 采用单线程,非阻塞,异步 IO 的工作模型. Apache2 对于每一个请求,都会创建一个新进程或线程,会浪费很多内存和 CPU 时间,而 N ...
- executeQueryForObject returned too many results.
//错误位置: 这个错误出现在持久层与数据库交互时,原因是 queryForObject这个方法封装唯一值,但是给出的sql语句返回了多个值 public int getListCount(SqlMa ...