201804231203->关于unity中的Attribute简单用法

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEngine;


/*
 * 需求:
 * 根据当前枚举字段的值来显示对应的字符串
 */


public enum MyEnum
{
    WX = 0,
    ZFB,
}


/*
 * 一般做法
 * 重新写一个方法用于获取传入的枚举值
 * 缺点:1.不能装逼 2.不能装逼 3.不能装逼 4.会令代码冗余 5.降低代码拓展性
 */


public class Test1
{
    public static string GetMyEnum(MyEnum myenum)
    {
        switch (myenum)
        {
            case MyEnum.WX:
                return "微信";


            case MyEnum.ZFB:
                return "支付宝";


            default:
                return "未知";
        }
    }
}


/*
 * 新做法
 * 利用Attribute属性拓展枚举内容,并且提高可读性
 * 关键知识点:1.Attribute类的作用 2.AttributeUsage下AttributeTargets的作用->限定符
 */


[System.AttributeUsage(AttributeTargets.Field | AttributeTargets.Enum)]
public class MyAttribute : Attribute
{
    public MyAttribute(string describe)
    {
        Describe = describe;
    }


    public string Describe { get; private set; }
}


/*
 * 重写属性描述
 * 对枚举值一个一个填上相应描述
 */


public enum MyNewEnum
{
    WX = 0,


    [MyAttribute("支付宝")]
    ZFB,
}


/*
 * 写入之后
 * 设置读取方法
 * 利用反射,将字段反射出来,然后再将字段下得属性反射出来,最后就可以达到需求
 */


public class GetMyEnumUtility
{
    public static string GetMyNewEnumDescribe(MyNewEnum target)
    {
        Type t = target.GetType();
        foreach (FieldInfo item in t.GetFields())
        {
            if (item.Name == target.ToString())
            {
                object[] info = item.GetCustomAttributes(typeof(MyAttribute), true);//反射自定义属性
                if (info.Any())
                {
                    return ((MyAttribute)info[0]).Describe;
                }
                else
                {
                    Debug.Log("查找特性失败");
                }
            }
        }
        return string.Empty;
    }
}


public class MyTest1
{
    public MyNewEnum testEnum;
    public MyEnum myEnum;


    public void Start()
    {
        testEnum = MyNewEnum.ZFB;
        myEnum = MyEnum.ZFB;
        Debug.Log(Test1.GetMyEnum(myEnum));//用一般方法读取自定字符串
        Debug.Log(GetMyEnumUtility.GetMyNewEnumDescribe(testEnum));//用新方法来读取当前字段
        testEnum = MyNewEnum.WX;
        Debug.Log(GetMyEnumUtility.GetMyNewEnumDescribe(testEnum));
    }
}


/*
 * 结果显示:
 * 支付宝
 * 支付宝
 * 查找特性失败
 * 空
 */
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章