C# 特性 学习记录
在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已定义”。