淺談Attribute [C# | Attribute | DefaultValueAttribute]

前言html

     最近作權限控制,對頁面的權限控制使用IHttpModule作的,想把控制粒度細化到頁面上控件的權限判斷,意圖是傳入控件編號,根據控件編號和當前用戶的權限,若是沒有權限的話就把控件隱藏或顯示爲不可用,打算用Attribute來作,如下是遇到的一些問題和見解,雖然失敗了可是以爲仍然有參考價值。編程

 

推薦幾篇文章:數組

          1.     Attribute在.net編程中的應用(一) ide

          2.     Attribute在.net編程中的應用(二) spa

          3.     Attribute在.NET編程中的應用(三) .net

          4.     Attribute在.NET編程中的應用(四) code

          5.     CLR筆記:17.自定義屬性 htm

 

正文:blog

          先看個人錯誤代碼ip

        [AttributeUsage(AttributeTargets.Class  |  AttributeTargets.Field  |  AttributeTargets.Method)]
        
public   class  PowerAttribute : Attribute
        {
            
///   <summary>
            
///  對頁面內控件進行權限判斷,權限的字符串組成:URL+"?id"+Control.ID
            
///      例如:/page/index?id=tbName
            
///   </summary>
            
///   <param name="pType"></param>
            
///   <param name="control"></param>
             public  PowerAttribute(PowerType pType,  params  WebControl[] control)
            {
                
for  ( int  i  =  control.Length;  -- >=   0 ; )
                {
                    WebControl Control 
=  control.GetValue(i)  as  WebControl;
                    
if  (Control  !=   null )
                        
if  (HasPower( string .Concat(WebHelper.WebRequest.Path,  " ?id= " , Control.ID))  ==   - 1 ) // 判斷權限
                             if  (pType  ==  PowerType.Visible)
                                Control.Visible 
=   false ;
                            
else
                                Control.Enabled 
=   false ;
                }
            }

            
public   int  HasPower( string  path)
            {
                
return   - 1 ;

            }

            
///   <summary>
            
///  得到控件的權限,1 具備權限,0 用戶超時,-1 沒有權限
            
///   </summary>
            
///   <param name="control"></param>
            
///   <param name="Field"></param>
             public  PowerAttribute(WebControl control,  ref   int  Field)
            {
                Field 
=  HasPower( string .Concat(WebHelper.WebRequest.Path,  " ?id= " , control.ID));
            }

            
///   <summary>
            
///  得到頁面的權限,1 具備權限,0 用戶超時,-1 沒有權限
            
///   </summary>
            
///   <param name="control"></param>
            
///   <param name="Field"></param>
             public  PowerAttribute( ref   int  Field)
            {
                Field 
=  HasPower(WebHelper.WebRequest.Path);
            }
        }

          意圖比較明顯,想在要控制控件權限的頁面裏面加一個Attribute標記傳入控件編號就能自動把其設置爲指定的顯示狀態,但是失敗了!如下是錯誤信息:

屬性參數必須是常量表達式、typeof 表達式或數組建立表達式 ConsoleTest

也就是說無法傳,也不可以用ref來傳遞引用!也就是說沒有辦法直接改變頁面上的控件或字段的值,這讓我突然想起了DefaultValueAttribute,MSDN的解釋是

指定屬性 (Property) 的默認值。我發現有許多朋友有點誤會這個,先看代碼:

         static   void  Main( string [] args)
        {
            AttributeCollection attributes 
=  TypeDescriptor.GetProperties( new  MyClass())[ " MyProperty " ].Attributes;

            
/*  Prints the default value by retrieving the DefaultValueAttribute 
             * from the AttributeCollection. 
*/
            DefaultValueAttribute myAttribute 
=
               (DefaultValueAttribute)attributes[
typeof (DefaultValueAttribute)];
            Console.WriteLine(
" The default value is:  "   +  myAttribute.Value.ToString());

            Console.Read();
        }

        
class  MyClass
        {
            
private   bool  myVal  =   false ;

            [DefaultValue(
false )]
            
public   bool  MyProperty
            {
                
get
                {
                    
return  myVal;
                }
                
set
                {
                    myVal 
=  value;
                }
            }

        }

          這是MSDN例子,注意看兩點:

               1.     DefaultValue傳入參數爲false,而myVal設置的也是false

               2.     再看調用的地方,是使用的DefaultValueAttribute,而不是直接訪問的屬性MyProperty

          狐疑了吧,他設置的默認值不是屬性MyProperty的默認值!!不信的話你能夠把[DefaultValue(false)]改爲[DefaultValue(true)],而後直接Console.WriteLine(new MyClass().MyProperty);!!

          從上面參考的幾篇文章中能夠發現,Attribute能夠作方法參數校驗、也能夠爲過期的方法作標記 ObsoleteAttribute爲方法傳參,雖然如此,可是仍然覺的使用起來並不方便,只是看起來比較酷罷了,一個類竟然能夠這樣使用!!能夠把這個類僅僅使用在類、方法、字段上,也可使用因此地方,控制使用次數,顯然仍然是有他的用處的,無法把你的代碼和他耦合起來,也是用反射來實現相關功能的!!

          說到這裏實在仍是不太明白,可是起碼知道DefaultValueAttribute不是爲當前類設置默認值的,因此使用的時候注意Attribute概念問題!歡迎你們提意見: )

相關文章
相關標籤/搜索