正文:

先看我的错误代码

        [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; --i >= 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概念问题!欢迎大家提意见: )

本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586471,如需转载请自行联系原作者

浅谈Attribute [C# | Attribute | DefaultValueAttribute]相关推荐

  1. iOS实录15:浅谈iOS Crash

    导语:在当前的iOS开发中,虽然ARC为开发者解决了手动内存管理时代 的许多麻烦,但是内存方面的问题依然是产生iOS Crash的元凶之一,本文介绍内存方面,有关僵尸对象.野指针.内存泄漏.废弃内存这 ...

  2. matplotlib的默认字体_浅谈matplotlib默认字体设置探索

    控制默认字体的设置 根据官方文档https://matplotlib.org/tutorials/text/text_props.html#default-font可知: The base defau ...

  3. vant-UI组件初使用:浅谈 - 解说篇

    vant-UI(有赞UI)组件使用 "深入浅出".全局组件注册VS局部注册:有何区同? 默认开发者已经能够独立创建和搭建vue-cli项目 以vue默认生成的项目目录和文件为例:( ...

  4. python中dtype什么意思_浅谈python 中的 type(), dtype(), astype()的区别

    如下所示: 函数 说明 type() 返回数据结构类型(list.dict.numpy.ndarray 等) dtype() 返回数据元素的数据类型(int.float等) 备注:1)由于 list. ...

  5. python命名规则数字开头的成语_浅谈Python中带_的变量或函数命名

    搜索热词 Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就 ...

  6. 浅谈OCR之Onenote 2010

    原文:浅谈OCR之Onenote 2010 上一次我们讨论了Tesseract OCR引擎的用法,作为一款老牌的OCR引擎,目前已经开源,最新版本3.0中更是加入了中文OCR功能,再加上Google的 ...

  7. 浅谈人工智能:现状、任务、构架与统一

    引言 第一节 现状:正视现实  第二节 未来:一只乌鸦给我们的启示  第三节 历史:从"春秋五霸"到"战国六雄"  第四节 统一:"小数据.大任务&q ...

  8. 浅谈Python类的属性和方法

    浅谈Python类的属性和方法 参考文献 在python中,有私有属性和公有属性,方法我们也一样,他们之间有何区别? 还有类属性和实例属性又是怎么回事? 静态方法和类方法又有什么区别? 我们在工作过程 ...

  9. 浅谈Google认证失败项分析

    https://www.cnblogs.com/houser0323/p/14002924.html 标签:Google认证.GMS认证.XTS失败项分析.Android.cts 作者:秋城 http ...

  10. 浅谈jQuery属性获取

    浅谈jQuery的属性获取 基本标签设置与基本css,附图下所示 上述代码如下图: 一.js的一些属性获取 1.var div = document.getElementById("firs ...

最新文章

  1. GPT-3到来,程序员会被AI取代吗?
  2. juc java_深入理解JUC(java.util.concurrent)
  3. NUnitForms 测试GUI应用程序的优秀工具
  4. Hudson升级异常及解决办法
  5. ADS2017打开出现cannot create the directory,解决办法。
  6. 记录几个CentOS安装包(rpm)的下载地址-离线安装必备
  7. linux怎么查看定时任务有没有运行,怎么看crontab定时任务是否执行
  8. Collection如何转成stream以及Spliterator对其操作的实现
  9. 乘坐飞机时,有什么事情是机长和机上工作人员不想让乘客知道的?
  10. VMware Funsion 修改vmnet1/vmnet8默认网络地址及DHCP地址
  11. protues7 使用笔记
  12. ETERM操作和错误集合
  13. 计算机网络常见面试题目
  14. Android问题集锦(六)- adb不是内部或外部命令解决方法
  15. 运动神经元有哪些特征 容易与哪些疾病混淆
  16. 数据库生成日然周、自然月、自然日
  17. 渗透测试安全检测漏洞
  18. Python中英文翻译工具
  19. YOLOv5改进添加解耦头、ASFF
  20. codevs 2830 蓬莱山辉夜

热门文章

  1. C语言:求1!至20!的和
  2. 理光2500文件服务器,理光打印机文件服务器地址
  3. 珍藏版linux运维笔试题
  4. 计算机入门模拟券b,计算机入门模拟卷B(有详细答案).doc
  5. 广东石油化工学院计算机考研资料汇总
  6. eclipse 配置Android开发环境
  7. OA系统选型建议考虑这5大维度
  8. 高德地图API简单记录
  9. A4988 步进电机驱动模块测试
  10. FastDFS 上传下载