zoukankan      html  css  js  c++  java
  • 使用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);
  • 相关阅读:
    mac上python3安装HTMLTestRunner
    双目深度估计传统算法流程及OpenCV的编译注意事项
    深度学习梯度反向传播出现Nan值的原因归类
    1394. Find Lucky Integer in an Array
    1399. Count Largest Group
    1200. Minimum Absolute Difference
    999. Available Captures for Rook
    509. Fibonacci Number
    1160. Find Words That Can Be Formed by Characters
    1122. Relative Sort Array
  • 原文地址:https://www.cnblogs.com/dcz2015/p/10943759.html
Copyright © 2011-2022 走看看