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


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

                                   电子科技大学软件学院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,以下是上面示例的完整代码:

    示例代码


     

  • 相关阅读:
    解码.NET 2.0配置之谜(二)
    .NET (C#) Internals: Delegates (1)
    .NET (C#) Internals: Delegates (2)
    Windows Vista Beta 2 尝鲜
    assembly 需要 unload 和 update 的时候怎么办?测试工程
    让 NDoc 1.3 支持.NET 2.0 程序集,泛型输出和 Visual studio 2005 解决方案导入
    号召,有兴趣做博客园自己的网络游戏的请举手..
    将执行文件转化为bat批处理文件的工具(批处理文件方式提供)
    ISAPI Filter实现的防盗链程序终于完工
    1分钟破解3dState '学习版'得一些版权信息。
  • 原文地址:https://www.cnblogs.com/zhouyinhui/p/520240.html
Copyright © 2020-2023  润新知