C# 特性 学习记录

发布于:2025-02-15 ⋅ 阅读:(101) ⋅ 点赞:(0)

        在C#中,特性(Attribute)是一种用于向代码元素(如类、方法、属性等)添加元数据的机制。特性本身不会直接影响代码的执行,但它们可以提供额外的信息,这些信息可以在运行时通过反射(Reflection)来读取和使用。

用法:

一、描述

using System;

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class DescriptionAttribute : Attribute
{
    public string Description { get; set; }
    public DescriptionAttribute(string description)
    {
        Description = description;
    }
}
[DescriptionAttribute("描述特性") ]//Attribute允许省略
public class Test
{

}

public class Program
{
    public static void Main(string[] args)
    {
        Type type= typeof(Test);
        object[] attributes = type.GetCustomAttributes(typeof(DescriptionAttribute), false);
        if(attributes.Length > 0)
        {
            DescriptionAttribute descriptionAttribute= (DescriptionAttribute)attributes[0];
            Console.WriteLine(descriptionAttribute.Description);//会输出文字:描述特性
        }
        Console.Read();
    }
}

二、标记过时方法

using System;
 
public class Program
{
    [Obsolete("该方法已过时")]
    public static void ObsoleteMethod()
    {

    }
    public static void Main(string[] args)
    {
        ObsoleteMethod();
        Console.Read();
    }
}

三、控制序列化

using System;
using System.IO;
using System.Xml.Serialization;

[Serializable]
public class Test
{
    public string field1 = "";
    [XmlIgnore]
    public string field2 = "";
}

public class Program
{
    public static void Main(string[] args)
    {
        Test test;
        Test testDeserializer;
        XmlSerializer serializer;
        StringWriter writer;
        StringReader reader;

        test = new Test();
        test.field1 = "field1";
        test.field2 = "field2";

        serializer = new XmlSerializer(typeof(Test));
        writer = new StringWriter(); 
        serializer.Serialize(writer, test);
        Console.WriteLine($"XML序列化结果:\n{writer}");

        reader = new StringReader(writer.ToString());
        testDeserializer = (Test)serializer.Deserialize(reader);
        Console.WriteLine($"XML反序列化结果:\nfield1:[{testDeserializer.field1}].field2:[{testDeserializer.field2}]" );
        Console.Read();
    }
}

四、自定义验证

using System;
using System.Reflection;

[AttributeUsage(AttributeTargets.Property)]
public class RangeAttribute : Attribute
{
    public int Min { get; }
    public int Max { get; } 
    public RangeAttribute(int min, int max)
    {
        Min = min;
        Max = max;
    }   
}

public class Test
{
    [Range(114,514)]
    public int Property1 {  get; set; }

    public  Test(int property1)
    {
        Property1 = property1;
    }

    public bool ValidateProperty1()
    {
        MemberInfo property1 = typeof(Test).GetProperty("Property1");
        RangeAttribute rangeAttribute = (RangeAttribute)Attribute.GetCustomAttribute(property1, typeof(RangeAttribute));
        if (rangeAttribute != null)
        {
            return Property1 >= rangeAttribute.Min && Property1 <= rangeAttribute.Max;
        }
        else
        {
            return true;
        }
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Test test1 = new Test(123);
        Test test2 = new Test(999);
        Console.WriteLine(test1.ValidateProperty1());
        Console.WriteLine(test2.ValidateProperty1());
        Console.Read();
    }
}

五、条件编译

#define Debug
using System;
using System.Diagnostics;

public class Program
{
    [Conditional("Debug")]
    public static void Log(string message)
    {
        Console.WriteLine(message);
    }

    public static void Main(string[] args)
    {
        Log("Debug已定义");
        Console.Read();
    }
}

注释掉#define Debug代码,则执行不会输出“Debug已定义”。


网站公告

今日签到

点亮在社区的每一天
去签到