OneBigLoser
OneBigLoser
发布于 2024-07-24 / 15 阅读
0
0

特性Attribute的学习

特性 (Attributes) 的解释

在C#中,特性(Attributes)是一种将元数据或声明性信息附加到代码(如类、方法、属性等)上的方式。特性不会影响代码的逻辑,但可以影响代码在运行时的行为或提供关于代码的信息。

用途及在游戏开发中的应用

通用用途

  • 配置:通过特性来配置类或方法的行为,如序列化配置或测试方法配置。

  • 插件架构:标记插件和插件的各种功能或特性。

  • 权限控制:标记方法或类需要的权限。

游戏开发中的用途

  • 资产管理:标记游戏资源的特定属性,如资源路径或类型。

  • 状态保存:在游戏开发中,标记哪些属性需要被保存和加载。

  • 编辑器扩展:标记属性或方法,在游戏编辑器中以特定方式展示。

基本概念和语法规则

特性通常使用方括号 [] 来声明,并放置在它要应用的元素之前。特性可以有参数,参数可以是位置参数或命名参数。

如何声明

  1. 定义特性
    使用 Attribute 类作为基类来定义新的特性。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = true)]
public class MyCustomAttribute : Attribute
{
    public string Description { get; }
    public int Version { get; }

    public MyCustomAttribute(string description, int version)
    {
        Description = description;
        Version = version;
    }
}

  1. 使用特性
    应用到类、方法或属性等。

[MyCustomAttribute("This is a sample class", 1)]
public class SampleClass
{
    [MyCustomAttribute("This is a sample method", 2)]
    public void SampleMethod()
    {
        Console.WriteLine("Executing SampleMethod");
    }
}

示例代码

using System;

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = true)]
public class MyCustomAttribute : Attribute
{
    public string Description { get; }
    public int Version { get; }

    public MyCustomAttribute(string description, int version)
    {
        Description = description;
        Version = version;
    }
}

[MyCustomAttribute("This is a sample class", 1)]
public class SampleClass
{
    [MyCustomAttribute("This is a sample method", 2)]
    public void SampleMethod()
    {
        Console.WriteLine("Executing SampleMethod");
    }
}

class Program
{
    static void Main()
    {
        var type = typeof(SampleClass);
        var classAttributes = type.GetCustomAttributes(false);
        Console.WriteLine("Class Attributes:");
        foreach (var attr in classAttributes)
        {
            var myAttr = attr as MyCustomAttribute;
            if (myAttr != null)
            {
                Console.WriteLine($"Description: {myAttr.Description}, Version: {myAttr.Version}");
            }
        }

        var method = type.GetMethod("SampleMethod");
        var methodAttributes = method.GetCustomAttributes(false);
        Console.WriteLine("\nMethod Attributes:");
        foreach (var attr in methodAttributes)
        {
            var myAttr = attr as MyCustomAttribute;
            if (myAttr != null)
            {
                Console.WriteLine($"Description: {myAttr.Description}, Version: {myAttr.Version}");
            }
        }
    }
}

解释

  • 定义了一个自定义特性 MyCustomAttribute,包含 DescriptionVersion 属性。

  • 使用 MyCustomAttribute 为类 SampleClass 和方法 SampleMethod 添加特性。

  • Main 方法中,通过反射获取并输出类和方法的特性信息。

优点和缺点

优点

  • 灵活性:特性提供了一种灵活的方式来添加元数据。

  • 解耦:可以在不改变代码逻辑的情况下,为代码添加额外的信息。

缺点

  • 复杂性:过多使用特性可能会使代码难以理解。

  • 性能影响:反射读取特性可能影响性能,尤其在大量使用时。

练习题目

基础题目

  1. 创建一个特性 DebugInfoAttribute,用于存储调试信息如作者名和修订日期,并将其应用到方法上。

更有难度的题题

  1. 为游戏中的不同类型的类(如敌人、道具、环境元素)创建和应用自定义特性,记录它们的分类信息(如类别名称、是否可互动等),并在运行时使用反射读取和处理这些信息。


评论