• 如何自定义特性并解析它们


            如何自定义特性并解析它们

                                   电子科技大学软件学院03级02班 周银辉

            特性(Attribute),使得我们可以将一些自定义信息附加到程序实体上,这非常有用,比如我们可以利用它来加密函数库,记录其它一些重要信息等。

            1,如何定义一个我们所需要的特性:
                   1),特性实际上和普通的类一样,只不过它必须继承于Attribute类。
                   2),我们适用AttributeUsage特性来限定自定义特性的使用范围。
            比如我们创建一个用于给类加密的密码特性:
            
    /// <summary>
        
    /// 自定义密码特性,该特性只可应用于类
        
    /// </summary>
        [AttributeUsage(AttributeTargets.Class)]
        
    public class PasswordAttribute : Attribute
        {
            
    string psw;

            
    public string Psw
            {
                
    get
                {
                    
    return psw;
                }
                
    set
                {
                    psw 
    = value;
                }
            }

            
    public PasswordAttribute(string psw)
            {
                
    this.psw = psw;
            }
        }

        以后我们就可以像使用其它特性一样将我们的密码特性作用于其它类上了。
        比如:
        /// <summary>
        
    /// 测试类,该类有一个密码特性
        
    /// </summary>
        [Password("123")]
        
    public class TestClass
        {
           
        }


        
        2,如何解析自定义的特性:
        我们将TestClass赋予了一个密码“123”,我们如何解析出这个密码呢?
        很简单,这需要了解一个名为CustomAttributeData的类,它为自定义特性提供反射访问。
        比如:
           /// <summary>
            
    /// 获取指定类型的密码特性
            
    /// </summary>
            
    /// <param name="type">类型</param>
            
    /// <returns>密码</returns>
            public static string GetPassword(Type type)
            {

                
    //扫描指定类型的所有自定义特性
                foreach (CustomAttributeData data in CustomAttributeData.GetCustomAttributes(type))
                {
                    
    //如果是密码特性
                    if (data.Constructor.DeclaringType.Equals(typeof(PasswordAttribute)))
                    {
                        
    //返回密码特性的第一个参数,也就是密码
                        if (data.ConstructorArguments.Count > 0)
                        {
                            
    return data.ConstructorArguments[0].Value.ToString();
                        }
                    }
                }

                
    return string.Empty;
            }

    其它更复杂的操作可以参考MSDN,以下是上面示例的完整代码:

    示例代码


     

  • 相关阅读:
    计算机中的那些缩写词
    Linux 下dns的搭建
    html中的定位
    编程基础之流程控制
    linux中kvm的安装及快照管理
    zabbix 中监控windows 的typepref中的值
    详解Linux交互式shell脚本中创建对话框实例教程_linux服务器
    rhel7 单用户修改root密码
    Linux vim编辑器使用详解
    Linux下用ftp更新web内容!
  • 原文地址:https://www.cnblogs.com/zhouyinhui/p/520240.html
Copyright © 2020-2023  润新知