C# Attributes 笔记

这篇博客详细介绍了C#中的Attributes,包括Obsolete特性使用、自定义特性类的创建、利用特性展示记事本插件名字的方法,以及正则表达式校验Attribute的应用,提供了一种通用的校验方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Attribute

Attribute是给compiler看的,compiler会给提示信息。

特性对象是类的(或者属性的,方法的),不是对象的,类似static成员。

通过对象获取不到attribute对象,必须通过Type。

Obsolete特性示例

    class Person {
        //给方法加attributes, Obsolete实际上是ObsoleteAttribute类,这里也可以写成[ObsoleteAttribute]
        [Obsolete]
        public void SayHi() {
            Console.WriteLine();
        }

        [Obsolete("obsolete method, please use NewSayHi2")]
        public void NewSayHi1() { 
        
        }

        public void NewSayHi2()
        {

        }
    }

    [Obsolete("obsolete class")]
    class Dog { 
    }
   class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            p.SayHi();
            p.NewSayHi1();
            p.NewSayHi2();
            Dog d = new Dog();
            Console.ReadLine();
        }
    }
编译的时候,会给警告提示。

特性的本质:看il代码,实际上是在方法或者类中中创建了一个ObsoleteAttribute类的实例。VS根据判断类或者方法,属性中是否有attribute类的实例,如果有根据Attribute类的Message属性来得到提示消息。



自定义特性类

    [Message]
    class Animal { 
    }

    [Name]
    [Obsolete]
    class Cat : Animal { 
    
    }

    class NameAttribute : Attribute {
        private String name;
        public NameAttribute() { }
        public NameAttribute(String name) {
            this.name = name;
        }
        public String Name {
            get { return name; }
        }
    }

    class MessageAttribute : Attribute
    {

    }

不能给一个类(或方法,属性)贴多个 同一个特性。

    [Name]
    [Obsolete]
    class Cat { 
    
    }
        static void GetCustomAtrributesTest() {
            Cat cat1 = new Cat();
            Cat cat2 = new Cat();
            Type tCat = cat1.GetType();
            //得到所有这个类的attributes对象,包括继承来的
            IEnumerable<Attribute> attrs = tCat.GetCustomAttributes();
            //得到这个类的所有attributes对象,不包括继承来的
            object[] attrs1 = tCat.GetCustomAttributes(false);
            //得到某一个attribute对象
            Attribute nameAttributeObj = tCat.GetCustomAttribute(typeof(NameAttribute), false);
        }

看ButtonBase的源码,VS通过这些attributes显示 属性窗口中的各种信息


用特性方法显示记事本程序插件的名字

在MyNoteBookPlugInterfaceProject项目中加一个类:

namespace MyNoteBookPlugInterfaceProject
{
    public class PlugInNameAttribute : Attribute
    {
        private String name;
        public PlugInNameAttribute(String name)
        {
            this.name = name;
        }
        public String Name {
            get { return name; }
        }
    }
}
在NoteBookPlugIn项目中:
namespace NoteBookPlugIn
{
    [PlugInName("转换成大写")]
    public class PlugToUpper : MyNoteBookPlugInterfaceProject.IPlugIn
    {

        public string ProcessText(string text)
        {
            return text.ToUpper();
        }
    }
}
namespace NoteBookPlugIn
{
    [PlugInName("转换成小写")]
    public class PlugToLower : IPlugIn
    {
        public string ProcessText(string text)
        {
            return text.ToLower();
        }
    }
}

把新的NoteBookPlugIn.dll copy到MyNoteBookProject\bin\Debug\plugs目录下。

在记事本项目中,用attribute给menuitem的Header赋值
                        Attribute attr = t.GetCustomAttribute(typeof(PlugInNameAttribute), false);
                        MenuItem item = new MenuItem { Header = ((PlugInNameAttribute)(attr)).Name };

正则表达式校验Attribute : 一个通用的校验方法


1. 写RegexAttribute类

    class RegexAttribute : Attribute
    {
        String pattern;
        public RegexAttribute(String pattern)
        {
            this.pattern = pattern;
        }
        public bool IsMatch(String str){
            Console.WriteLine(str);
            if(str == null){
                return false;
            }
            return Regex.IsMatch(str, pattern);
        }
    }
2. 写验证方法,验证一个对象内有RegexAttribute特性的属性。 检查属性的值是否符合属性的规则(定义在属性的特性中)
    static class RegexUtil {
        public static bool CheckObjProperties(object obj) {
            bool ret = true;
            Type tObj = obj.GetType();
            PropertyInfo[] props = tObj.GetProperties(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic);
            foreach (var p in props)
            {
                RegexAttribute regAttr = p.GetCustomAttribute(typeof(RegexAttribute), false) as RegexAttribute;
                if (regAttr != null)
                {
                    String strValue = p.GetValue(obj).ToString();
                    //Console.WriteLine(strValue);
                    if (!regAttr.IsMatch(strValue)) {
                        ret = false;
                        break;
                    }
                }
            }
            return ret;
        }
    }
3. 写一个类,在给属性加RegexAttribute特性
    class Bird {
        [RegexAttribute(@"\w{3,}")]
        public String Name { get; set; }
        [RegexAttribute(@"^\d{1,2}$")]
        public int Age { get; set; }
    }
4. 测试方法
        static void RegexAttributeTest() {
            Bird bird = new Bird { Name = "ast", Age=55555};
            if (RegexUtil.CheckObjProperties(bird))
            {
                Console.WriteLine("ok");
            }
            else {
                Console.WriteLine("not oK");
            }
        }


C#正则表达式小结

http://www.cnblogs.com/tempmen/archive/2010/07/20/1781576.html




基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值