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));
}
}
/*
* 結果顯示:
* 支付寶
* 支付寶
* 查找特性失敗
* 空
*/
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));
}
}
/*
* 結果顯示:
* 支付寶
* 支付寶
* 查找特性失敗
* 空
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.