Attribute之自定义

在前一篇文章中介绍到了Attribute的一些基本概念,至于它的一些具体的用法还没有意义解释,现在就针对Attribute的自定义问题,通过实例来加强了解吧!

(一)自定义部分

<span style="font-size:18px;">using System;
usingSystem.Collections.Generic;
usingSystem.Diagnostics;
using System.Linq;
usingSystem.Runtime.InteropServices;
using System.Text;
usingSystem.Reflection;
using System.Data;

namespaceConsoleApplication1
{

    #region ORMapping
   [AttributeUsageAttribute(AttributeTargets.Class, Inherited = false,AllowMultiple = false)]
    public class TableAttribute : Attribute
    {
        //保存表名的字段
        private string _tableName;

        public TableAttribute()
        {
        }

        public TableAttribute(string tableName)
        {
            this._tableName = tableName;
        }

        /// <summary>
        /// 映射的表名(表的全名:模式名.表名)
        /// </summary>
        public string TableName
        {
            set
            {
                this._tableName = value;
            }
            get
            {
                return this._tableName;
            }
        }
    }
   [AttributeUsageAttribute(AttributeTargets.Property, Inherited = false,AllowMultiple = false)]
    public class ColumAttribute : Attribute
    {
        private string _columName;

        private DbType _dbType;

        public ColumAttribute()
        {
        }

        public ColumAttribute(string columName)
            : this()
        {
            this._columName = columName;
        }

        public ColumAttribute(string columName,DbType dbType)
            : this(columName)
        {
            this._columName = columName;
            this._dbType = dbType;
        }

        //列名
        public virtual string ColumName
        {
            set
            {
                this._columName = value;
            }
            get
            {
                return this._columName;
            }
        }

        //描述一些特殊的数据库类型
        public DbType DbType
        {
            get { return _dbType; }
            set { _dbType = value; }
        }

    }</span>

(二)实体部分

<span style="font-size:18px;"> [Table("User")]
    public class User
    {
        [Colum("userID", DbType =DbType.Int32)]
        public int UserID { get; set; }
        [Colum("UserName", DbType =DbType.String)]
        public string UserName { get; set; }
    }</span>

(三)语法构造部分

<span style="font-size:18px;"> public class ORMHelp
    {
        public void Insert(object table)
        {
            Type type = table.GetType();
            //定义一个字典来存放表中字段和值的对应序列
            Dictionary<string, string>columValue = new Dictionary<string, string>();
            //用于拼接sql字符串
            StringBuilder SqlStr = newStringBuilder();
            SqlStr.Append("insert into");
            //得到表名子
            TableAttribute temp =(TableAttribute)type.GetCustomAttributes(typeof(TableAttribute),false).FirstOrDefault();
            SqlStr.Append(temp.TableName);

            SqlStr.Append("(");

            PropertyInfo[] Propertys =type.GetProperties();
            foreach (var item in Propertys)
            {
                object[] attributes =item.GetCustomAttributes(false);
                foreach (var item1 inattributes)
                {
                    //获得相应属性的值
                    string value =table.GetType().InvokeMember(item.Name,System.Reflection.BindingFlags.GetProperty, null, table, null).ToString();
                    ColumAttribute colum =item1 as ColumAttribute;
                    if (colum != null)
                    {
                       columValue.Add(colum.ColumName, value);
                    }
                }
            }
            //拼插入操作字符串
            foreach (var item in columValue)
            {
                SqlStr.Append(item.Key);
                SqlStr.Append(",");

            }
            SqlStr.Remove(SqlStr.Length - 1,1);
            SqlStr.Append(")values('");
            foreach (var item in columValue)
            {
                SqlStr.Append(item.Value);
                SqlStr.Append("','");

            }
            SqlStr.Remove(SqlStr.Length - 2,2);
            SqlStr.Append(")");
           Console.WriteLine(SqlStr.ToString());
            Console.Read();

        }
    }</span>

(四)前端调用

<span style="font-size:18px;"> public class project
    {
        //实例ORMapping
        static void Main(string[] args)
        {
            ORMHelp o = new ORMHelp();
            User u = new User() { UserID = 1,UserName = "lfm" };
            o.Insert(u);
        }
    }</span>

执行后的效果:

(五)总结

Attribute的自定义简单的来说就
是一种实例化方式比较特殊的类,特别注意的就是AttributeUsage 这个专门用来修饰Attribute的Attribute ,除了可以控制修饰目标外,还能决定被它修饰的Attribute是否可以随宿主“遗传”,以及是否可以使用多个实例来修饰同一个目标!希望在今后的学习和工作中经常用到。

时间: 2024-08-09 18:59:18

Attribute之自定义的相关文章

Attribute和自定义Property

property(属性) attribute(特性) property和attribute的同步 id href value class/className 旧IE的趣事 attribute作为DOM节点 总结 DOM节点可能会有attribute和property. 有时候人们会分不清,因为他们是有关联的,但它们又是完全不同的. property DOM是一个对象.因此它可以像普通对象一样存储自定义property及方法. 下例将会给 document.body 添加自定义对象 myData.

Attribute(二)——自定义特性+Asp.net MVC中的filter详解

上篇博客是关于特性中有关预定义特性的一些基础,同时也是对Attribute这一概念的一个宏观上的认识,在上篇博客结尾介绍了有关为自定义特性服务的AttributeUsage,这篇博客主要是通过filter的使用间接的了解自定义特性的具体应用. 一.filter简介 在了解自定义特性前,先引入一个概念filter,它是MVC中自带的一种功能,在我们项目中通常会遇到在Action执行前或结束时,去执行日志记录或错误处理等功能,通常可使用AOP截取来实现,但是在MVC中提供了filter过滤,大大方便

C#自定义Attribute

Attribute 类被称为特性.是一种可由用户自由定义的修饰符(Modifier),可以用来修饰各种需要被修饰的目标.可以修饰类,接口,属性,方法等.它不同于注释,注释在程序被编译的时候会被编译器所丢弃,因此,它丝毫不会影响到程序的执行.而Attribute是程序代码的一部分,不但不会被编译器丢弃,而且还会被编译器编译进程序(Assembly)的元数据(Metadata)里,在程序运行的时候,你随时可以从元数据里提取出这些附加信息来决策程序的运行. Framework中我们有时候调用方法,会提

JSTL标签库,自定义标签

JSTL 简介 JavaServer Pages Standard Tag Library由JCP(Java Community Process)指定标准 提供给 Java Web 开发人员一个标准通用的标签函数库 和 EL 配合来取代传统直接在页面上嵌入 Java 程序(Scripting)的做法,以提高程序可读性.维护性和方便性 JSTL1.1安装 下载 JSTL 主要由Apache组织的Jakarta Project 实现 http://tomcat.apache.org/taglibs/

.net学习之Attribute特性和EF关键知识点

一.Attribute特性/标签1.Attribute用来对类.属性.方法等标注额外的信息,贴一个标签简单的说,定制特性Attribute,本质上就是一个类,它为目标元素提供关联附加信息,并在运行时以反射的方式来获取附加信息.[Obsolete("此方法已过时")]public void SayHi(){ }加上Obsolete特性,当鼠标放到调用方法上的时候,就会提示此方法已过时2.Attribute自定义特性类Attribute就是类,Attribute类名一般都以Attribut

Writing Your Own Widget(自定义组件)

英文地址:http://dojotoolkit.org/reference-guide/1.10/quickstart/writingWidgets.html#quickstart-writingwidgets 从头单独开发一个控件十分困难,我们提供有一些组件,你如果想修改他们或者扩展一个自己的组件,这是毫无问题的. Dijit的组件具有可扩展性,修改组件时你没有必要熟读源代码.很多时候,你只需要通过设定组件的属性达到自己想要的目标,例如:滑块儿长度默认为0-100,你可以设定属性0-200达到

.NET进阶篇03-Reflection反射、Attribute特性

知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂 内容目录 一.概述二.反射1.反射使用2.创建对象3.调用方法4.字段属性三.特性四.总结 一.概述 反射其实无处不在,我们用VS进行调试时候,查看成员列表.修改变量值都是通过反射来实现的.我们写业务代码可能很少去写反射,但理解反射是从菜鸟到大牛的必经之路.无论EF还是ASP.NET,几乎所有框架都用到反射.反射动态创建对象.动态赋值.动态调用方法. 前面简单介绍过.NET的第一次编译,会编译成IL(中间语言),反射就是利用IL在运行时获取

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

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

web前端之css快速入门

css简介 css概述 CSS 指层叠样式表 (Cascading Style Sheets)样式定义如何显示 HTML 元素样式通常存储在样式表中把样式添加到 HTML 4.0 中,是为了解决内容与表现分离的问题外部样式表可以极大提高工作效率外部样式表通常存储在 CSS 文件中多个样式定义可层叠为一 css基础语法 css规则由两个主要部分构成:选择器,以及一条或多条声明selector选择器 declaration声明 selector {declaration1; declaration2