C#特性

特性是一个类,需要继承或间接继承System.Attribute。

1.常见的特性

  AttributeUsage:定义特性定义到目标元素。

  Flags:将枚举值作为位标记,而非数值。

        [Flags]
        public enum Animal
        {
            Dog = 0x0001,
            Cat = 0x0002,
            Chicken = 0x0004,
            Duck = 0x0008
        }
    
        Animal animal = Animal.Dog| Animal.Cat;
      WriteLine(animal.ToString());//Animal使用Flags特性,输出Dog,Cat;不使用Flags特性,输出3     

  DllImport:调用非托管代码。

    public class DllImportDemo
    {
        [DllImport("User32.dll")]
        public static extern int MessageBox(int hParent, string msg, string caption, int type);
        public static int Main()
        {
            return MessageBox(0, "使用特性", ".NET Attribute", 0);
        }
    }

    //调用
    DllImportDemo.Main();

2.尝试自己写一个特性

    [AttributeUsage(AttributeTargets.Property,  //应用于属性
        AllowMultiple = false,                  //不允许应用多次
        Inherited = false)]                     //不继承到派生类
    public class TrimAttribute : System.Attribute
    {
        public Type Type { get; set; }
        public TrimAttribute(Type type)
        {
            Type = type;
        }
    }
    /// <summary>
    /// TrimAttribute:实现扩展方法Trim()  --必须是静态类、静态方法、第一个参数用this修饰
    /// </summary>
    public static class TrimAttributeExt
    {
        public static void Trim(this object obj)
        {
            Type tobj = obj.GetType();
            foreach (var prop in tobj.GetProperties())
            {
                //GetCustomAttributes(typeof(TrimAttribute), false),返回TrimAttribute标识的特性
                foreach (var attr in prop.GetCustomAttributes(typeof(TrimAttribute), false))
                {
                    TrimAttribute tab = (TrimAttribute)attr;
                    if (prop.GetValue(obj) != null && tab.Type == typeof(string))
                    {
                        prop.SetValue(obj, GetPropValue(obj, prop.Name).ToString().Trim(), null);
                    }
                }
            }
        }
        private static object GetPropValue(object obj, string propName)
        {
            //使用指定绑定约束并匹配指定的参数列表,调用指定成员
            return obj.GetType().InvokeMember(propName, BindingFlags.GetProperty, null, obj, new object[] { });
        }
    }

特性类代码

    public class User
    {
        public int Id { get; set; }
        [Trim(typeof(string))]
        public string UserName { get; set; }
        [Trim(typeof(string))]
        public string Password { get; set; }
    }

 using static System.Console;//静态类可以使用using static
namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //DllImportDemo.Main();

            User user = new User { Id = 1, UserName = " admin     ", Password = " 1234 " };
            user.Trim();//该行行注释掉有空格
            WriteLine("|" + user.UserName + "|");

            ReadKey();
        }
    }
}

使用代码

时间: 2024-12-20 17:41:10

C#特性的相关文章

web新特性 之 WebSocket

详情参见:你真的了解WebSocket吗?     WebSocket系列教程   HTML5新特性之WebSocket WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实现了浏览器与服务器全双工(full-duplex)通信.其本质是保持TCP连接,在浏览器和服务端通过Socket进行通信. 服务端与客户端的连接不断开,实现全双工的操作.及服务端或是客户端都会给对方发送消息. WebSocke

ASP.NET MVC 使用Remote特性实现远程属性验证

RemoteAttribute是asp.net mvc 的一个验证特性,它位于System.Web.Mvc命名空间 下面通过例子来说明 很多系统中都有会员这个功能,会员在前台注册时,用户名不能与现有的用户名重复,还要求输入手机号码去注册,同时手机号码也需要验证是否重复,下面是实体类 /// <summary> /// 会员 /// </summary> public class Member { public int Id { get; set; } [Required(Error

C#图解教程 第二十四章 反射和特性

反射和特性元数据和反射Type 类获取Type对象什么是特性应用特性预定义的保留的特性Obsolete(废弃)特性Conditional特性调用者信息特性DebuggerStepThrough 特性其他预定义特性有关应用特性的更多内容多个特性其他类型的目标全局特性自定义特性声明自定义特性使用特性的构造函数指定构造函数使用构造函数构造函数中的位置参数和命名参数限制特性的使用自定义特性的最佳实践访问特性使用IsDefined方法使用GetCustomAttributes方法 Note 类的元数据包含

Java精品高级课,架构课,java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,第三方支付,web安全,视频教程

36套精品Java架构师,高并发,高性能,高可用,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,P2P金融项目,大型分布式电商实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Elasticsearch,Redis.ActiveMQ.Nginx.Mycat.Spring.MongoDB.ZeroMQ.Git.Nosql.Jvm.Mecached.Netty.Nio.Mina.java8新特性,P2P金融项目,程序设计,

数据库事务的四大特性和事务隔离级别

Reference: [1] http://www.cnblogs.com/fjdingsd/p/5273008.html [2] http://blog.csdn.net/fg2006/article/details/6937413 数据库事务四大特性 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全

java特性之继承

继承这一特性是面向对象的重要概念,好处就是提高代码的复用,节约开发时间. 在java中继承是指在父类的基础上扩展功能,继承中分为子类和父类. 类有两种重要成员:成员变量和方法. java中子类通过关键字extends可以获得父类的成员变量和方法.子类的成员中可以有自己声明定义的变量,也有从父类继承的. java中继承的特点: 1.单根继承,向上只有一个节点,所有的类继承的根节点都是Object类. 2.java不支持多继承.一个类不能同时继承多个类*(可以实现多喝接口). 3.子类重写父类的方法

js的ES6特性

一. let和const关键字 let出现之前,js所有的作用域都是以函数为单位的,只要在一个function里声明的var, 无论是for循环等块里面声明的还是在块外面声明的,整个function都可以使用这个var,比如: function foo() { for (var i=0; i<100; i++) { // } i += 100; // 仍然可以引用变量i } 我个人的理解是js的提升特性,函数会将里面声明的所有var都提升到函数开始的地方,所以整个函数内都共享这些var. let

C#网络程序设计(1)网络编程常识与C#常用特性

    网络程序设计能够帮我们了解联网应用的底层通信原理!     (1)网络编程常识: 1)什么是网络编程 只有主要实现进程(线程)相互通信和基本的网络应用原理性(协议)功能的程序,才能算是真正的网络编程. 2)网络编程的层次 现实中的互联网是按照"TCP/IP分层协议栈"的体系结构构建的,因此程序员必须搞清楚自己要做的是哪个层次上的编程工作. TCP/IP协议体系的实现情况: 其中,网络接口层已经被大多数计算机生产厂家集成在了主板上,也就是经常所说的网卡(NIC).windows操

Atitit js es5 es6新特性 attilax总结

1.1. JavaScript发展时间轴:1 1.2. 以下是ES6排名前十的最佳特性列表(排名不分先后):1 1.3. Es6 支持情况 基本chrome ff 360se8全面支持了2 2. ECMAScript 2015(ES6)的十大特征 – WEB前端开发 - 专注前端开发,关注用户体验.html2 1.1. JavaScript发展时间轴: 1.1995:JavaScript诞生,它的初始名叫LiveScript. 2.1997:ECMAScript标准确立. 3.1999:ES3出

NET(C#):XmlArrayItem特性和XmlElement特性在序列化数组的差别

https://www.mgenware.com/blog/?p=142 比如这样一个类,我们用XmlArrayItem特性标明数组内出现的元素类型: public class a{ [XmlArrayItem(Type = typeof(int)), XmlArrayItem(Type = typeof(Guid)), XmlArrayItem(Type = typeof(string))] public object[] arr = new object[] { 12, "hehe"