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