C# 编程指南:特性(Attributes)和元数据(Metadata)

在C#中,特性(Attributes)和元数据(Metadata)是与代码元素相关的重要概念。

部分
1
特性(Attributes)
特性是一种用于在代码中添加元数据的声明性标记。
特性可以应用于类、方法、属性、字段等代码元素,以提供有关该元素的额外信息。
在C#中,特性以方括号[]的形式应用于代码元素。
using System;

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

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

[Custom("This is a custom attribute")]
public class MyClass
{
    [Custom("This is a custom attribute")]
    public void MyMethod()
    {
        // 方法体
    }
}

public class Program
{
    static void Main(string[] args)
    {
        Type myClassType = typeof(MyClass);
        var classAttributes = myClassType.GetCustomAttributes(true);

        Console.WriteLine("Class Attributes:");
        foreach (var attribute in classAttributes)
        {
            if (attribute is CustomAttribute customAttribute)
            {
                Console.WriteLine(customAttribute.Description);
            }
        }

        var methodInfo = myClassType.GetMethod("MyMethod");
        var methodAttributes = methodInfo.GetCustomAttributes(true);

        Console.WriteLine("\nMethod Attributes:");
        foreach (var attribute in methodAttributes)
        {
            if (attribute is CustomAttribute customAttribute)
            {
                Console.WriteLine(customAttribute.Description);
            }
        }
    }
}

在上述示例中,我们定义了一个名为CustomAttribute的自定义特性,继承自Attribute类。我们还定义了一个名为MyClass的类和一个名为MyMethod的方法,并将CustomAttribute应用于它们。 在Main方法中,我们使用反射获取MyClass的类型,并获取应用于类和方法的特性。然后,我们遍历特性集合,并打印出它们的描述信息。

部分
2
元数据(Metadata)
元数据是描述代码元素的信息,例如类型、方法、属性等的特性、名称、参数、返回类型等。
在C#中,可以使用反射来访问和操纵元数据。
反射提供了一组类(如Type、MethodInfo、PropertyInfo等等),用于检索和操作代码元素的元数据。
using System;
using System.Reflection;

public class MyClass
{
    public string Name { get; set; }

    public void MyMethod(int value)
    {
        Console.WriteLine("Value: " + value);
    }
}

public class Program
{
    static void Main(string[] args)
    {
        Type myClassType = typeof(MyClass);

        // 获取类的名称
        string className = myClassType.Name;
        Console.WriteLine("Class Name: " + className);

        // 获取属性的名称和类型
        PropertyInfo propertyInfo = myClassType.GetProperty("Name");
        string propertyName = propertyInfo.Name;
        Type propertyType = propertyInfo.PropertyType;
        Console.WriteLine("Property Name: " + propertyName);
        Console.WriteLine("Property Type: " + propertyType);

        // 获取方法的名称和参数
        MethodInfo methodInfo = myClassType.GetMethod("MyMethod");
        string methodName = methodInfo.Name;
        Console.WriteLine("Method Name: " + methodName);

        ParameterInfo[] parameters = methodInfo.GetParameters();
        foreach (var parameter in parameters)
        {
            string parameterName = parameter.Name;
            Type parameterType = parameter.ParameterType;
            Console.WriteLine("Parameter Name: " + parameterName);
            Console.WriteLine("Parameter Type: " + parameterType);
        }
    }
}

在上述示例中,我们定义了一个名为MyClass的类,并在Main方法中使用反射获取了该类的元数据。 我们使用Type类的Name属性获取类的名称,使用GetProperty方法获取属性的名称和类型,使用GetMethod方法获取方法的名称,以及使用GetParameters方法获取方法的参数信息。 通过访问元数据,我们可以动态地了解代码元素的结构和特征,并在运行时根据需要进行操作和处理。

    目录

  • 1.
    特性(Attributes)
  • 2.
    元数据(Metadata)