C#枚举及特性应用

枚举(Enum)

枚举的主要使用场景

1.提高代码可读性:使用枚举可以给特定的数据集起一个有意义的名字,这样在阅读代码时更容易理解这些数据代表的意义。

2.减少错误:通过限制变量只能取枚举中定义的值,可以避免输入非法或无意义的值,从而减少程序中的错误。

3.类型安全:枚举是类型安全的,这意味着编译器可以检查类型正确性,防止不同类型的枚举值之间的混淆。

4.便于维护:如果需要修改或扩展枚举中的值,通常只需要修改枚举定义本身,而不需要更改使用这些值的代码。

5.实现逻辑控制:枚举常用于实现逻辑控制结构,如switch-case语句,使逻辑更加清晰。

6.表示状态或选项:枚举非常适合用来表示有限的状态集合或选项列表,比如一周中的某一天、颜色、方向等。

7.资源管理:在某些情况下,枚举可以用来表示系统中的资源或配置选项,帮助管理和访问这些资源。

8.数据交换与存储:枚举可以简化数据交换和存储的过程,特别是在序列化和反序列化对象时,使用枚举可以使数据更加紧凑和易于理解。

枚举在代码中的表现

1.创建一个普通的类Class改为Enum,并且Enum可以继承基础类型

2.各个属性间用逗号分隔,起名尽量见名知意

3.使用时只需用枚举名.枚举值即可

4.作为switch的判定条件时,使用枚举变量即可

5.枚举与基础类型的转换使用TryParse(value,out enum) value为基础类型或string enum为枚举类型变量

6.遍历枚举时只需通过Enum.GetValues(typeof(LineNameEnum))获取到枚举中所有值再进行foreach遍历即可

7.转换成字符串类型只需调用ToString方法即可

C#特性(Attribute)

特性的主要应用场景

1.提供元数据:特性可以为程序元素(如类、方法、字段等)添加额外的信息,这些信息可以在编译时或运行时被其他代码访问。

2.影响运行时行为:通过特性,可以改变程序元素在运行时的行为。例如,使用[Serializable]特性可以让类支持序列化。

3.编译时验证:某些特性可以用于编译时验证代码的正确性,如[Obsolete]特性可以标记过时的方法或类,当使用这些过时的成员时,编译器会发出警告或错误。

4.代码生成:特性可以用于指导代码生成工具生成特定的代码。例如,在ASP.NET MVC中,路由特性可以用来指定URL映射规则。

5.自定义行为:开发者可以通过创建自定义特性来实现特定的功能或需求,如日志记录、权限检查等。

这里主要讲一下自定义特性

比如我们定义了一个自定义特性

在使用时我们需默认省略掉Attribute即[LineName("")]

LineNameAttribute在定义时需要public class LIneNameAttribute :Attribute 需要继承特性类,并且在定义时可以自由定义他的属性以及构造函数比如

{

  public string Name{get;private set}

  LineNameAttribute(string name)

{

  Name = name;
}

}

在这里我们调用[LineName("BeiJing9")]时就会将特性中的Name值改为BeiJing9,这个值独属于附加上这个特性的变量或方法

比如

[LineName("BeiJing9")]

public class myapp

{

  //类体

}

在调用myapp这个类时我们可以使用反射获得特性值

比如

Attribute中的GetCustomAttribute()方法,参数列表选择typeof(myapp),typeof(LineNameAttribute)  使用(LineNameAttribute)强制转换一下类型,使用LineNameAttribute对象接收,使用创建出来的对象line即可访问line.Name;

组合使用

为枚举创建一个特性,给每个枚举类型加上特性

创建一个GetAttribute方法接收一个Enum值

获取所有具有指定名称的公共字段fieldInfo,然后通过fieldInfo调用GetCustomAttribute方法获取特性对象,接下来就可以通过这个对象获得属性Name了

public string GetLineNameAttribute(LineNameEnum value)
{
var fieldInfo = value.GetType().GetField(value.ToString());
var attribute = fieldInfo.GetCustomAttribute(typeof(LineNameAttribute), false) as LineNameAttribute;
if (attribute.Name != null)
return attribute.Name;
return null;
}

通过反向寻值就没什么好讲的了,将特性值反向寻找枚举只需要遍历枚举对比传入值合适再返回即可,代码奉上

public LineNameEnum? GetLineNameEnum(string value)
{

foreach (LineNameEnum a in Enum.GetValues(typeof(LineNameEnum)))
{
var feildInfo = a.GetType().GetField(a.ToString());
var attribute = feildInfo.GetCustomAttribute(typeof(LineNameAttribute), false) as LineNameAttribute;
if (attribute != null && attribute.Name == value)
{
return a;
}
}
return null;
}

posted @   无情之结  阅读(139)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示