C# Attribute
Attribute 是C#非常重要的一块内容,需要研究一下。
Attribute 的简单使用:简而言之,就是可以自定义通用标志位,而不是在每个所需的类型中分别增加标志位。
//class专用attribute [AttributeUsage(AttributeTargets.Class)] public class TestAttribute : Attribute { public bool ReadFlag { get; set; } public bool WriteFlag { get; set; } public TestAttribute(){ } public TestAttribute(bool readFlag, bool writeFlag) { this.ReadFlag = readFlag; this.WriteFlag = writeFlag; } } //property专用attribute [AttributeUsage(AttributeTargets.Property)] public class TestFieldAttribute : Attribute { public bool IsIgnore { get; set; } public TestFieldAttribute(){ } public TestFieldAttribute(bool isIgnore) { this.IsIgnore = isIgnore; } } //数字基类 public abstract class TestDemoBase { public abstract int Num { get; set; } } //数字类一 [Test(true, true)] //使用时可以去掉"Attribute"后缀 public class TestDemoA : TestDemoBase { [TestField(IsIgnore = false)] public override int Num { get; set; } } //数字类二 [Test(true, false)] public class TestDemoB : TestDemoBase { [TestField(IsIgnore = true)] public override int Num { get; set; } } //针对数字基类的打印接口 public static class Writer { public static void Output<T>(T writer) where T : TestDemoBase { var objectType = typeof(T); //typeof参数为类型而不是对象 var tagAttr = objectType.GetCustomAttribute(typeof(TestAttribute), false) as TestAttribute; //获取类的单个attribute if(tagAttr.WriteFlag == true) { Console.WriteLine("Output:" + writer.Num.ToString()); //write标志为true则可以打印 } else { var propertyInfo = objectType.GetProperty("Num"); foreach (var attribute in propertyInfo.GetCustomAttributes(false)) //获取所有attributes { if (attribute.GetType() == typeof(TestFieldAttribute)) { if ((attribute as TestFieldAttribute).IsIgnore == true) //成员有ignore则可以忽略write标志 Console.WriteLine("Output:" + writer.Num.ToString()); } } } } } public class Program { static void Main(string[] args) { var demoA = new TestDemoA(); demoA.Num = 10; var demoB = new TestDemoB(); demoB.Num = 20; Writer.Output(demoA); Writer.Output(demoB); Console.Read(); } }
看来马上要学习一下 C# 的反射原理了。
浙公网安备 33010602011771号