当前位置:   article > 正文

Unity自定义属性(Attribute)示例_unity 自定义attribute

unity 自定义attribute

一.自定义属性,使用场景

        a.想知道当前的工程内定义过的特定的类

        b.想知道当前工程内,类中定义过的特定的成员(变量,方法)

二.自定义属性介绍

        a.需要继承自 System.Attrbute。 可以有自己的成员

        b.Attribute参数说明:

                参数一:代表该属性使用的位置。例如:field, method, class等,详细看枚举

                参数二:字面意思,是否允许多个存在

                参数三:表示派生类,是否也拥有该属性。 True:表示拥有

        c. 示例代码:field的使用自定义属性

  1. [AttributeUsage(AttributeTargets.Field, AllowMultiple=true, Inherited=true)]
  2. public class TestFieldAttribute : System.Attribute
  3. {
  4. private string _name;
  5. public string name => _name;
  6. /// <summary>
  7. /// 构造函数
  8. /// </summary>
  9. /// <param name="UIName">编辑器上显示的名字</param>
  10. public TestFieldAttribute(string UIName)
  11. {
  12. _name = UIName;
  13. }
  14. }
  15. [AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=false)]
  16. public class TestClassAttribute : System.Attribute
  17. {
  18. private string _name;
  19. public string name => _name;
  20. /// <summary>
  21. /// 构造函数
  22. /// </summary>
  23. /// <param name="UIName">编辑器上显示的名字</param>
  24. public TestClassAttribute(string UIName)
  25. {
  26. _name = UIName;
  27. }
  28. }
  29. [AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
  30. public class TestMethodAttribute : System.Attribute
  31. {
  32. private string _name;
  33. public string name => _name;
  34. /// <summary>
  35. /// 构造函数
  36. /// </summary>
  37. /// <param name="UIName">编辑器上显示的名字</param>
  38. public TestMethodAttribute(string UIName)
  39. {
  40. _name = UIName;
  41. }
  42. }

        d.使用示例:注意使用的时候可以省略掉Attribute,语言支持的

  1. [TestClass("测试类")]
  2. public class ThisIsClass
  3. {
  4. [TestField("测试属性")]
  5. [TestField("测试属性")]
  6. public string thisIsField;
  7. [TestMethod("测试方法")]
  8. public void TestMethod()
  9. {
  10. }
  11. }

三.如果获取加过指定自定义属性的类,成员

        思路:扫描当前工程内所有的类,所有的属性。判定其自定义属性,与自定义属性是否相等

        a. 获取工程内添加过自定义属性的类,示例

  1. private static void GetTestAttrType()
  2. {
  3. var doMain = AppDomain.CurrentDomain;
  4. // var assemblies = doMain.ReflectionOnlyGetAssemblies(); 也可以通过反射
  5. var assemblies = doMain.GetAssemblies();
  6. // 遍历,所有的程序集
  7. for (int i = 0; i < assemblies.Length; i++)
  8. {
  9. //TODO 此处可以过滤掉不需要的程序集,提升效率
  10. var assembly = assemblies[i];
  11. var types = assembly.GetTypes();
  12. // 遍历程序集内所有的类型
  13. for (int j = 0; j < types.Length; j++)
  14. {
  15. var typeNameSpace = types[j].Namespace;
  16. // 过滤命名空间,提升效率
  17. if (string.IsNullOrEmpty(typeNameSp!typeNameSpace.Equals("命名空间"))
  18. continue;
  19. // 过滤掉泛型, 可有可无
  20. if (types[j].IsGenericTypeDefinition)
  21. continue;
  22. var attr = types[j].GetCustomAttribute<TestClassAttribute>();
  23. if (attr == null)
  24. continue;
  25. // 此处识别到了添加了指定自定义属性的Type,以及属性中的值
  26. Type targetType = types[j];
  27. string uiName = attr.name;
  28. }
  29. }
  30. }

        b.识别添加了自定义属性的成员,示例代码

  1. private static Dictionary<string, FieldInfo> GetTestFieldAttrs(Type actionType)
  2. {
  3. Dictionary<string, FieldInfo> result = new Dictionary<string, FieldInfo>();
  4. var flag = BindingFlags.Instance | BindingFlags.Public;
  5. var fields = actionType.GetFields(flag);
  6. if (fields == null || fields.Length <= 0)
  7. {
  8. return result;
  9. }
  10. for (int i = 0; i < fields.Length; i++)
  11. {
  12. var attr = fields[i].GetCustomAttribute<TestFieldAttribute>();
  13. if (attr != null)
  14. {
  15. // 此处识别到了添加了指定自定义属性的成员,以及属性中的值
  16. result.Add(attr.name, fields[i]);
  17. }
  18. }
  19. return result;
  20. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/585571
推荐阅读
相关标签
  

闽ICP备14008679号