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));
    }
}


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