📜  C#中的自定义属性(1)

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

C#中的自定义属性

在C#中,我们可以使用自定义属性来为代码中的类型、方法、属性等添加元数据信息,从而可以在运行时获取这些信息。本文将从以下几个方面来介绍C#中的自定义属性:

  • 基本概念
  • 定义和使用自定义属性
  • 内置特性
  • 反射和自定义属性
基本概念

属性(Attribute)是作为程序元素的说明,对程序中的类型、方法、属性等进行描述和注释的一种手段。自定义属性(Custom Attribute)是使用C#编写的自定义的属性类型。它们以[System.Attribute]为基类,并以Attribute结尾的类。

在使用自定义属性时,需要注意以下几点:

  • 属性名称必须以Attribute结尾,例如MyAttribute。
  • 属性类必须继承于System.Attribute。
  • 属性可以使用命名参数或位置参数来传递值。命名参数使用名称来标识参数,位置参数使用参数的顺序来标识参数。
  • 一个程序元素可以有多个自定义属性,而一个自定义属性也可以应用到多个程序元素上。
定义和使用自定义属性

定义自定义属性示例:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyAttribute : System.Attribute
{
    private string _name;

    public MyAttribute(string name)
    {
        _name = name;
    }

    public string Name
    {
        get { return _name; }
    }
}

上述代码定义了一个名为MyAttribute的自定义属性,它可以应用到类或方法上,并且有一个名称属性。当我们使用这个自定义属性时,可以通过命名参数或者位置参数来传递值。例如:

[My("TestClass")]
public class TestClass
{
    [My("TestMethod")]
    public void TestMethod()
    {
        // do something
    }
}

在上述代码中,我们将MyAttribute应用到了TestClass类和TestMethod方法上,并为它们分别指定了名称,这些信息可以在程序运行时进行获取。

内置特性

在C#中,有一些内置的特性,它们可以用来添加更丰富的元数据信息。

  • [Obsolete],用于标记已经过时的程序元素。
  • [DllImport],用于指明引用的外部动态链接库文件。
  • [Serializable],用于标记可以被序列化的类型。
  • [Conditional],用于标记使用了预处理器指令的程序元素。
  • [Conditional("DEBUG")],用于标记只有在项目设置为Debug模式下才会编译的程序元素。
反射和自定义属性

在运行时,我们可以使用反射机制来获取程序中的自定义属性。

获取类或方法的自定义属性示例:

Type type = typeof(TestClass);
MyAttribute attr = (MyAttribute)type.GetCustomAttributes(typeof(MyAttribute), false)[0];
Console.WriteLine("Class Name: {0}, Attribute Name: {1}", type.Name, attr.Name);

MethodInfo method = type.GetMethod("TestMethod");
attr = (MyAttribute)method.GetCustomAttributes(typeof(MyAttribute), false)[0];
Console.WriteLine("Method Name: {0}, Attribute Name: {1}", method.Name, attr.Name);

运行上述代码,我们可以得到如下输出结果:

Class Name: TestClass, Attribute Name: TestClass
Method Name: TestMethod, Attribute Name: TestMethod

在获取自定义属性时,我们需要使用typeof操作符来指定要获取的属性类型,并通过GetCustomAttributes方法来获取目标程序元素上的所有自定义属性。由于一个程序元素可以应用多个自定义属性,所以GetCustomAttributes方法返回的是一个数组。