数值权限控制(C#)

    技术2022-05-11  68

    using System;using System.Text;using System.Text.RegularExpressions;

    namespace HKH.Common{ /// <summary> /// 数值权限,以数字表示权限,该类实现权限的合并/拆分/验证 /// </summary> /// <remarks> /// Write By Lwt on 2006 - 10 - 8 /// </remarks> public class clsRight {  private clsRight()  {  }

      /// <summary>  /// 根据权限字符串生成权值  /// </summary>  /// <param name="strRight"></param>  /// <returns></returns>  /// <remarks>  /// Truth : RightValue = Power(2,X) + Power(@,Y)  /// </remarks>  public static int MakeRightValue( string strRight )  {   if ( null == strRight || "" == strRight )    return 0;

       double dRightValue = 0;   MatchCollection mcRight = Regex.Matches(clsString.RemoveDup(strRight),@"/d+");

       foreach (Match mRight in mcRight)   {    dRightValue += Math.Pow(2,double.Parse(mRight.Value));   }

       return Convert.ToInt32(dRightValue);  }

      /// <summary>  /// 反算权限字符串  /// </summary>  /// <param name="iRight"></param>  /// <returns></returns>  /// <remarks>  /// Truth : X = Log(2,RightValue - Power(2,Y))  /// </remarks>  public static string GetRightString( int iRight )  {   if ( 0 == iRight )    return null;

       int iTemp = iRight;   double dLog = Math.Log(iTemp,2);   StringBuilder szRight = new StringBuilder();

       while ( 0 != iTemp && dLog > 0 )   {    dLog = Math.Floor(dLog);

        #region 权值修正

        //因为精度的问题,在权值等于8时,取对数的结果为2.999999996,取Floor后为2,会发生取值错误    //Truth : 如果一个数大于2的N次幂-1,小于2的N次幂+1,则该数等于2的N次幂    if ( iTemp > (Math.Pow(2,dLog + 1) - 1) && iTemp < (Math.Pow(2,dLog + 1) + 1))     dLog += 1;        #endregion

        szRight.Append( "," );    szRight.Append( Convert.ToInt32(dLog) );

        iTemp = iTemp - Convert.ToInt32( Math.Pow(2,dLog) );    dLog = Math.Log( iTemp,2 );   }

       return szRight.Remove(0,1).ToString();  }

      /// <summary>  /// 反算权限字符串  /// 此重载用于父子权限合并  /// </summary>  /// <param name="iRights">各级权限组成的数组</param>  /// <returns></returns>  public static string GetRightString( int[] iRights)  {   if( null == iRights || 0 == iRights.Length )    return null;

       return GetRightString( UniteRight (iRights) );  }

      /// <summary>  /// 验证权限  /// </summary>  /// <param name="iAllRight">所拥有的总权限</param>  /// <param name="iCurrRight">当前要验证的权限</param>  /// <returns></returns>  public static bool ValidateRight( int iAllRight,int iCurrRight )  {   if ( iAllRight == (iAllRight | iCurrRight) )    return true;

       return false;  }

      /// <summary>  /// 验证权限  /// </summary>  /// <param name="iAllRights"></param>  /// <param name="iCurrRight"></param>  /// <returns></returns>  public static bool ValidateRight( int[] iAllRights,int iCurrRight )  {   if( null == iAllRights || 0 == iAllRights.Length )    return false;      int iTemp = UniteRight( iAllRights );

       if ( iTemp == (iTemp | iCurrRight) )    return true;

       return false;  }

      /// <summary>  /// 父子权限合并  /// </summary>  /// <param name="iRights"></param>  /// <returns></returns>  public static int UniteRight( int[] iRights )  {   if( null == iRights || 0 == iRights.Length )    return 0;

       int iTemp = 0;

       foreach( int iRight in iRights)   {    iTemp |= iRight;   }       return iTemp;  } }} 


    最新回复(0)