No title

特性

**[Obsolete("这个方法弃用了")]**:

  • 标记已过时的代码,警告开发者该代码不应再使用。

**[DebuggerStepThrough]**:

  • 指示调试器在此方法中跳过步骤调试。

调用者信息特性:

  1. [CallerFilePath]
    • 获取调用者的源文件路径。
  2. [CallerLineNumber]
    • 获取调用者的源文件行号。
  3. [CallerMemberName]
    • 获取调用者的方法名或属性名。

这些特性只能应用于方法参数上,并且它们的值是由编译器在编译时自动插入的。

1
2
3
4
5
6
7
8
9
10
11
// 记录日志的方法,带有调用者信息特性
public void Log(string message,
[CallerFilePath] string filePath = "",
[CallerLineNumber] int lineNumber = 0,
[CallerMemberName] string memberName = "")
{
Console.WriteLine($"Message: {message}");
Console.WriteLine($"File Path: {filePath}");
Console.WriteLine($"Line Number: {lineNumber}");
Console.WriteLine($"Member Name: {memberName}");
}

自定义特性

1
2
3
[public] sealed class InformationAttribute:Attribute
{
}

特点:

1,自定义特性必须继承自 System.Attribute 类。

2,必须是密封类(sealed)

3,包含三个字段:

1
2
3
public string developer;//开发者
public string version;//版本
public string description;//描述类的主要作用

定义特性类

  1. 特性类的基本定义
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    using System;

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

    public MyCustomAttribute(string description)
    {
    Description = description;
    }
    }

    AttributeUsage 特性指定了这个特性可以应用于哪些代码元素(AttributeTargets.Class | AttributeTargets.Method),是否可以继承(Inherited = true),以及是否可以多次应用(AllowMultiple = false)。

  2. 特性类的属性和字段

    特性类可以包含公共属性和字段,以便存储附加的信息。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
    public class DocumentationAttribute : Attribute
    {
    public string Author { get; }
    public string Version { get; }

    public DocumentationAttribute(string author, string version)
    {
    Author = author;
    Version = version;
    }
    }

总结

  • 特性类的定义:必须继承自 System.Attribute,可以包括构造函数、属性和字段。
  • **AttributeUsage**:指定特性适用的代码元素、继承性和是否可以多次使用。
  • 特性的应用:将特性应用到类、方法等代码元素上。
  • 读取特性信息:使用反射在运行时获取特性信息。