特性的用处
一般用来影响某一个类的个别字段或者方法
定义特性
需要将类继承Attribute

可以通过构造函数的方式影响使用特性的方法

可以通过给自定义的特性通过加AttributeUsage特性的方法进行进一步管理

AttributeUsage特性默认传三个参数
第一个参数一般用来约束此自定义特性是否可以给类和字段使用
第二个参数若是为false,则不可以给一个类多个特性

若是为true则可以使用

第三个参数一般控制此自定义特性是否可以被继承
案例展示
在拓展类内部实现
cs
/// <summary>
/// 获取特性
/// </summary>
public static T GetAttribute<T>(this object obj) where T : Attribute
{
return obj.GetType().GetCustomAttribute<T>();
}
/// <summary>
/// 获取特性
/// </summary>
/// <param name="type">特性所在的类型</param>
/// <returns></returns>
public static T GetAttribute<T>(this object obj, Type type) where T : Attribute
{
return type.GetCustomAttribute<T>();
}
测试案例
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Reflection;
[Text(false)]
public class Test : MonoBehaviour
{
private int num;
void Start()
{
TextAttribute text = this.GetAttribute<TextAttribute>();
if (text.canSwitch)
{
Debug.Log("可以切换");
}
}
void Update()
{
}
}
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Field,AllowMultiple = false)]
public class TextAttribute : Attribute
{
public bool canSwitch;
public TextAttribute(bool canSwitch)
{
this.canSwitch = canSwitch;
}
}