使用C#中的Flags特性

举个例子:我有如下的一个需求,当我想要取得用户信息的时候,会先从本地缓存中查找,找不到然后从分布式缓存中查找,最后找不到再从数据库中查询。但是有些场景我又不需要查询数据库。

所以我想建立如下这种模型。

public UserEntity  GetUserInfo(List<DataSource>  dataSources)
{
    var xxxx = new UserEntity();
    if(dataSources.Any(DataSource.Local)
    {
        //从本地缓存中获取
        return xxxx;
    }

    if(dataSources.Any(DataSource.Distribution)
    {
        //从分布式缓存中获取
        //更新本地缓存
        return xxxx;
    }

    if(dataSources.Any(DataSource.DB)
    {
        //从DB中获取
        //更新分布式缓存
        //更新本地缓存
    }
    return xxxx;
}

但是每次调用者都去构建一个List,比较麻烦,此时我们可以使用枚举中的Flags特性,修改程序如下:

首先是枚举的定义上,要加上   [Flags] 特性标签,并且定义 一般都是 2的n次方,主要是便于位移运算

/// <summary>
///  数据取得地方
/// </summary>
[Flags]
public enum DataSource
{
    /// <summary>
    ///     本地缓存
    /// </summary>
    [Description("本地缓存")]
    LocalCache = 1,

    /// <summary>
    ///    分布式缓存
    /// </summary>
    [Description("分布式缓存")]
    DistributeCache = 2,

    /// <summary>
    ///     数据库
    /// </summary>
    [Description("数据库")]
    DB = 4,
}

修改代码:

public UserEntity  GetUserInfo(DataSource dataSources)
{
    var xxxx = new UserEntity();
    if(dataSources.HasFlags(DataSource.Local)
    {
        //从本地缓存中获取
        return xxxx;
    }

    if(dataSources.HasFlags(DataSource.Distribution)
    {
        //从分布式缓存中获取
        //更新本地缓存
        return xxxx;
    }

    if(dataSources.HasFlags(DataSource.DB)
    {
        //从DB中获取
        //更新分布式缓存
        //更新本地缓存
    }
    return xxxx;
}

调用的地方,可以通过“|”来指定,例如我只想用分布式缓存和数据库,那么:

var userInfo = GetUserInfo(DataSource.Distribution | DataSource.DB);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#如何创建自定义特性

    概述 特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签.您可以通过使用特性向程序添加声明性信息.一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的.要设计你自己的自定义特性,无需掌握许多新的概念. 如果你熟悉面向对象的编程,并且知道如何设计类,那么你已经具备大部分所需知识. 自定义特性本质上是直接或间接派生自 System.Attribute的传统类. 与传统类一样,自定义特性包含用于存储和检索数据的方法.

  • C#新特性之可空引用类型

    安装 您必须下载Visual Studio 2017 15.5预览版(目前最新发布版本是15.4),下载地址:https://www.visualstudio.com/en-us/news/releasenotes/vs2017-preview-relnotes. 安装Roslyn扩展预览版本: 下载并解压 Roslyn_Nullable_References_Preview.zip [最新版本 11/15/17]: 关闭所有运行的Visual Studio: 运行zip根目录中的 .\inst

  • C#语法新特性之元组实例详解

    1.元组(Tuple) 元组(Tuple)在4.0 的时候就有了,但元组也有些缺点,如: 1)Tuple 会影响代码的可读性,因为它的属性名都是:Item1,Item2.. . 2)Tuple 还不够轻量级,因为它是引用类型(Class),对于一个变量要使用一个类型,有点太没必要了. 源代码如下: // 摘要: // 提供用于创造元组对象的静态方法.若要浏览此类型的.NET Framework 源代码,请参阅 Reference Source. public static class Tuple

  • c#枚举值增加特性说明(推荐)

    通过特性给一个枚举类型每个值增加一个字符串说明,用于打印或显示. 自定义打印特性 [AttributeUsage(AttributeTargets.Field)] public class EnumDisplayAttribute : Attribute { public EnumDisplayAttribute(string displayStr) { Display = displayStr; } public string Display { get; private set; } } 打

  • C#中枚举的特性 FlagAttribute详解

    写在前面 枚举Enum 全称(Enumeration),即一种由一组称为枚举数列表的命名常量组成的独特类型.可以看出枚举的出现时为了使我们可以在程序中方便的使用一些特定值的常量,一般的使用大家都比较熟悉,本文主要介绍枚举的特性 FlagAttribute. FlagAttribute是什么? Flag 特性微软的解释是:指示可以将枚举作为位域(即一组标志)处理,FlagsAttribute属性就是枚举类型的一项可选属性,它的主要作用是可以将枚举作为位域处理(P.S. C#不支持位域).所谓位域是

  • C#中FlagsAttribute属性在enum中的应用详解

    Net C#中枚举的声明格式如下所示: [attributes] [modifiers] enum identifier [:base-type] {enumerator-list} [;] FlagsAttribute属性就是枚举类型的一项可选属性.它的主要作用是可以将枚举作为位域处理(P.S. C#不支持位域). 所谓位域 是单个存储单元内相邻二进制位的集合. 通过为枚举添加这个属性,可以改变枚举的一些行为来满足我们的需要. enum MyFlags { Flag1, Flag2, Flag

  • 详解C#枚举中使用Flags特性

    如果对一个值可以包含多个,那么可以使用枚举,加上Flags. 新建一个Flags枚举类型: [Flags] public enum Show { A = 0x00000001, B = 0x00000010, C = 0x00000100, D = 0x00001000, } 合并多个值 合并多个,使用| Show show = Show.A | Show.B 判断是否存在某个值 一个简单方法是用 HasFlag,但是一个方法是用& Show show=Show.A | Show.B; show

  • 使用C#中的Flags特性

    举个例子:我有如下的一个需求,当我想要取得用户信息的时候,会先从本地缓存中查找,找不到然后从分布式缓存中查找,最后找不到再从数据库中查询.但是有些场景我又不需要查询数据库. 所以我想建立如下这种模型. public UserEntity GetUserInfo(List<DataSource> dataSources) { var xxxx = new UserEntity(); if(dataSources.Any(DataSource.Local) { //从本地缓存中获取 return

  • Oracle PL/SQL中异常高级特性示例解析

    PL/SQL(Procedural Language/SQL,过程语言/SQL)是结合了Oracel过程语言和结构化查询语言(SQL)的一种扩展语言. 优点: (1)PL/SQL具有编程语言的特点,它能把一组SQL语句放到一个模块中,使其更具模块化种序的特点. (2)PL/SQL可以采用过程性语言控制程序的结构. (3)PL/SQL有自动处理的异常处理机制. (4)PL/SQL程序块具有更好的可移植性,可移植到另一个Oracle数据库中. (5)PL/SQL程序减少了网络的交互,有助于提高程序性

  • Vue高版本中一些新特性的使用详解

    一.深度作用选择器( >>> ) 严格来说,这个应该是vue-loader的功能."vue-loader": "^12.2.0" 在项目开发中,如果业务比较复杂,特别像中台或B端功能页面都不可避免的会用到第三方组件库,产品有时会想对这些组件进行一些UI方面的定制.如果这些组件采用的是有作用域的CSS,父组件想要定制第三方组件的样式就比较麻烦了. 深度作用选择器( >>> 操作符)可以助你一臂之力. <template>

  • C++中const的特性的使用

    目录(作用): 1:修饰变量,说明该变量不可以被改变: 2:修饰指针,分为只想常量的指针和自身是常量的指针 3:修饰引用,指向常量的引用,用于修饰形参,即避免了拷贝,有避免了函数对值的修改: 4:修改成员函数:说明该成员函数内不能修改成员变量. 5:指针与引用 正文: 以下是对各种情况的示例: //注:1:const修饰的引用cj的值且引用的对象无法修改无法修改,但是引用的i是可修改的 #include <iostream> using namespace std; int main() {

  • 详解如何在ASP.NET Core中使用Route特性

    ASP.NET Core 中的 Route 中间件的职责在于将 request 匹配到各自 Route 处理程序上,Route 分两种:基于约定 和 基本特性 模式. 基于约定 模式的Route采用集中化的方式,而 基于特性 的方式允许你在 Action 或者 Controller 上单独定义,到底采用哪一种可以基于你自己的应用场景,本篇就来讨论如何使用 基于特性 模式. 创建 Controller 类 创建一个 DefaultController 类,新增如下代码. public class

  • java 对象实例化过程中的多态特性解析

    目录 java 对象实例化过程中的多态特性 通过案例说明 通过上述代码 java对象的三个特性(封装.继承.多态) 1.封装 2.继承 3.多态 java 对象实例化过程中的多态特性 执行对象实例化过程中遵循多态特性 ==> 调用的方法都是实例化的子类中的重写方法,只有明确调用了super.xxx关键词或者是子类中没有该方法时,才会去调用父类相同的同名方法. 通过案例说明 package com.njau.test1; class Test { public static void main(S

  • 一起来看看五条Python中的隐含特性

    目录 1. 引言 2. 函数属性 3. For-else循环 4. int型分隔符 5. eval() and exec() 6. 省略号 6.1 占位符 6.2 numpy数组中用于切片 7.总结 1. 引言 最近闲暇之余,我会去阅读一些Python文档,有时候会注意到一些有趣的Python特性,这些特性不禁让人惊呼:“哇,Python原来还可以这么写”. 闲话少说,我们直接开始吧. :) 2. 函数属性 和设置类和对象的属性类似,我们在Python中也可以为函数设置属性.样例代码如下: de

  • 解析Swift语言面相对象编程中的继承特性

    取大于形态的能力被定义为继承.一般一个类可以从另一个类继承属性和方法.类可以进一步划分到子类和超类. 子类:当一个类从另一个类继承属性,方法和功能被称为子类 超类:类包含属性,方法和功能被其它类继承称为超类 Swift 中类包含父类和调用访问方法,属性,功能和重写方法.另外,属性观察者也用于添加属性和修改所存储的或计算的特性的方法. 基类 一个类如果不从其它类继承方法,属性或功能,那么它被称为"基类". 复制代码 代码如下: classStudDetails{var stname:St

随机推荐