在C#中,特性(Attributes)和元数据(Metadata)是与代码元素相关的重要概念。
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的类型,并获取应用于类和方法的特性。然后,我们遍历特性集合,并打印出它们的描述信息。
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方法获取方法的参数信息。 通过访问元数据,我们可以动态地了解代码元素的结构和特征,并在运行时根据需要进行操作和处理。