📜  C#|特性(1)

📅  最后修改于: 2023-12-03 15:14:29.874000             🧑  作者: Mango

C# 特性

在 C# 中,特性是一种用于向程序元素(类、方法、属性等)添加声明性信息的语言结构。特性可以让你在不修改源代码的情况下,将元数据与程序元素相关联。你可以通过反射来读取特性信息,从而根据特性信息来执行特定的操作。

常见的特性

下面是一些常见的特性:

  • [Obsolete]: 标识该程序元素已过时。当其他开发人员试图使用过时的程序元素时,编译器会发出警告或错误提示。
  • [Serializable]: 标识该类可以被序列化。如果你要将对象序列化成 XML 或二进制格式,那么就需要使用这个特性。
  • [WebMethod]: 标识一个方法作为 Web 服务的方法。
  • [Conditional]: 标识该方法是否应该在编译期间被编译。
创建自定义特性

你也可以创建自己的特性。下面是一个简单的例子:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class MyAttribute : Attribute
{
    private string description;   
    
    public MyAttribute(string description)
    {
        this.description = description;   
    }
    
    public string Description
    {
        get { return this.description; }
    }
}

上面的特性定义了一个 MyAttribute 类,它有一个 Description 属性,用于存储特性描述。这个特性可以应用到方法上,因为 AttributeTargets.Method 中指定了方法。

你可以在方法上使用这个特性:

[My("This is my method description.")]
public void MyMethod()
{
    // Method body here
}
读取特性信息

你可以使用反射来读取特性信息。下面是一个简单的例子:

MethodInfo methodInfo = typeof(MyClass).GetMethod("MyMethod");
MyAttribute myAttribute = (MyAttribute)Attribute.GetCustomAttribute(methodInfo, typeof(MyAttribute));

if (myAttribute != null)
{
    Console.WriteLine(myAttribute.Description);
}

上面的代码使用反射获取 MyMethod 方法上的 MyAttribute 特性,并读取 Description 属性。如果该特性不存在,则不会输出任何内容。

总结

特性是一种非常有用的语言结构,它可以帮助你将元数据与程序元素相关联,并通过反射来读取特定的信息。C# 中有许多常见的特性,同时你也可以创建自己的特性来满足某些特定的需求。