DIY.NETORM框架——技术储备(1)Attribute

1、他是什么 ?

首先,我们肯定Attribute是一个类,下面是msdn文档对它的描述:

公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。

其实特别简单:Attribute就是一种“附着物”,就像超市商品上贴的标签。这些附着物的作用是为它们的附着体追加上一些额外的信息(这些信息就保存在附着物的体内),在商品上就像他的标签,是否参与特价等信息。

2、简单实例

实现:商场有N种商品,在特价商品柜台只结账特价商品

类说明:

Commodity:商品类

Program:卖特价商品的前台

[ConditionalAttribute("special")]:特价标签

[ConditionalAttribute("normal")]:非特价标签

代码:

<span style="font-size:18px;">#define special  // C#的宏定义必须出现在所有代码之前。当前我们只让special宏有效。(代表特价商品)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics; // 注意:这是为了使用包含在此名称空间中的ConditionalAttribute特性

namespace AttributeSample
{
    /// <summary>
    /// 商品类
    /// </summary>
    class Commodity
    {
        //特价商品*********************************************************************************
        /// <summary>
        /// 卖蛋糕
        /// </summary>
        [ConditionalAttribute("cake")]                                           // Attribute名称的长记法
        [ConditionalAttribute("special")]
        public static void sellCake() { Console.WriteLine("卖出的是蛋糕, 特性为:special(特价)."); }

        /// <summary>
        /// 卖饼干
        /// </summary>
        [Conditional("cookies")]
        [Conditional("special")]
        public static void sellCookies() { Console.WriteLine("卖出的是饼干, 特性为:special(特价)."); }

        //普通商品*********************************************************************************
        /// <summary>
        /// 卖牛奶
        /// </summary>
        [ConditionalAttribute("Milk")]
        [ConditionalAttribute("normal")]
        public static void sellMilk() { Console.WriteLine("卖出的是牛奶, 特性为:normal(普通)."); }

        /// <summary>
        /// 卖面包
        /// </summary>
        [Conditional("Bread")]                                               // Attribute名称的短记法
        [Conditional("normal")]
        public static void sellBread() { Console.WriteLine("卖出的是面包, 特性为:normal(普通)."); }

    }

    class Program
    {
        static void Main(string[] args)
        {
            //商品的商品都可在前台扫描
            Commodity.sellCake();
            Commodity.sellCookies();
            Commodity.sellMilk();
            Commodity.sellBread();
        }
    }

}
</span>

执行结果:

结果分析:

为什么四个方法只有两个执行了?大家再仔细观察,发现只有特性为special的方法被执行了,我们研究 ConditionalAttribute 发现,这个类的作用就是检测方法的特性,与提前定义好的特性相符的才会执行,否则不执行,大家别想得太深奥,实际就是一个拦截器,Attribute 这时候的作用就体现了出来,他的影响程序执行的,所以他并不是和注释一样被编译器屏蔽,但是又和普通的属性不一样,我们通过一个直接的英语翻译来看看他们在语义上的区别:

Attribute:认为…是; 把…归于; 把…品质归于某人; 认为某事[物]属于某人[物];

property:特性,属性; 财产,地产; [戏]道具; 所有权;

就好像我们定义一个房子,里面有客厅,卧室,餐厅,这是属于这个房子的一部分,是property,而房子分为阴面和阳面,我们将客厅和餐厅打上标签是阳面,卧室是阴面,这是Attribute,他们都是为了描述一事物,当我们写“class Commodity”这句代码时,实际系统给我们自动打上了一个Attribute:“class” !

总结:

当我们发现,有一个事物貌似和以前接触的事物很形似,怎么看怎么像一个东西,这时,我们的要做的就是暂时将他们归为一类,减少我们的知识结点,而随着我们学习的深入,我们发现他貌似有些不同,我们才恍然大悟,他们是那么不一样,这个时候才知道,发明两种东西是为了解决两个问题!就像Attribute和property在uml阶段我们就学过,那时我以为是一个东西……

这个例子既是一个技术的储备也告诉我自己,不要妄想一个东西一开始就弄的明明白白,知识是学习和积累出来的,不仅仅是学出来的!

DIY.NETORM框架——技术储备(1)Attribute

时间: 2024-10-19 01:08:07

DIY.NETORM框架——技术储备(1)Attribute的相关文章

DIY.NETORM框架——总体分析

一.故事 近些年一直开发MIS系统,用过PB,VB,C#  .如今学了半年的java,早先听人说,.NET和 java一直就是互相借鉴.一起升级.都是为了让程序开发趋于简单,高校,而这不可避免就肯定用到框架,对java中非常多框架的实现原理.我也比較感兴趣,在本系列的博客正,咱们将一起实现一个简单的.NET版 ORM框架. 有人会有疑问.网上有非常多成熟的ORM框架,为什么不直接用.偏偏要自己做一个呢? 对于这个答案.是仁者见仁的问题,就好似建造大厦,假设他停留在会照着图纸建房子,他肯定是个工人

DIY.NETORM框架——整体分析

一.故事 近些年一直开发MIS系统,用过PB,VB,C#  ,现在学了半年的java,早先听人说,.NET和 java一直就是互相借鉴,一起升级,都是为了让程序开发趋于简单,高校,而这不可避免就肯定用到框架,对java中很多框架的实现原理,我也比较感兴趣,在本系列的博客正,咱们将一起实现一个简单的.NET版 ORM框架. 有人会有疑问,网上有很多成熟的ORM框架,为什么不直接用,偏偏要自己做一个呢? 对于这个答案,是仁者见仁的问题,就好似建造大厦,如果他停留在会照着图纸建房子,他肯定是个工人,而

【JavsScript】JavaScript MVC 框架技术选型

你很喜欢Gmail和Trello之类的单页面应用,但是不太确定该从何开始.也许你的JavaScript代码是如此的杂乱无章,以致于你很想在下一个项目上尝试下JavaScript MVC库和框架,却苦于没有头绪?我正在撰写一本单页面应用的书,所以我阅读了大量网上的相关资料.在这里我尝试提供一些看法,希望可以帮助你下决定. 简介 这里讨论的是时下最热的框架,AngularJS.Backbone.Ember和Knockout.同时提到了Batman.CANjs.Meteor和Spine,但是没有详细展

JEESZ分布式框架--技术介绍文档

摘要: 1.Eclipse IDE:采用Maven项目管理,模块化.     2.代码生成:通过界面方式简单配置,自动生成相应代码,目前包括三种生成方式(增删改查):单表.一对多.树结构.生成后的代码如果不需要注意美观程度,生成后即可用. Rest服务,Redis,Spring,SpringMVC+Mybatis,Dubbo+Zookeeper,Java分布式架构 分布式.微服务.云架构,Spring,SpringMVC,Spring MVC+Mybatis,Dubbo+Zookeeper,Re

[ionic开源项目教程] - 第1讲 前言,技术储备,环境搭建,常用命令

前言 这是一个系列文章,将持续更新到项目完结,从环境搭建开始讲解,包括实战开发中遇到的各种问题的解决方案,都将毫无保留的分享给大家. 技术储备 开始本项目之前,请确保自己对以下技术点都有所了解. html,css,html5,css3,javascript,angularjs, 理解mvc或者mvvm分层的概念 了解CLI基础. 环境搭建 (有福利) 都知道开发环境搭建是一个麻烦事,作者在这里精心准备了一个已经配置好的开发包,内含jdk,sdk,ant,adb,和一个android23的模拟器.

Bootstrap框架技术

1.Bootstrap是前端开发的框架技术,其采用将整个网页划分为12列,进行框架搭建,通过其内部         特定代码可自动生成对应的各种样式.是比较方便快速的网页编写方法.2.col-xs-数字(占位的格数)         row=12,间距30px3.使用Bootstrap时,需要引入相应的文件         1.在css文件夹中放入文件夹css,js,和fonts:         2.引入文件名为.bootstrap.min.css(head部分用link方式引入)      

DL动态载入框架技术文档

DL动态载入框架技术文档 DL技术交流群:215680213 1. Android apk动态载入机制的研究 2. Android apk动态载入机制的研究(二):资源载入和activity生命周期管理 3. APK动态载入框架DL解析 4. Android 使用动态载入框架DL进行插件化开发 5. DL插件开发笔记 6. DL开发注意事项 附:DL层次结构图

对比React Native、dcloud、LuaView三个框架技术(内部)

转载自:http://www.jianshu.com/p/ee1cdb33db8d主要对比React Native和5+SDK(就是dcloud的SDK)两个: 开发语言:三个都是用其他语言来统一开发IOS.android应用的框架技术,其中,React Native是使用纯JS,5+SDK是使用JS和html,LuaView则是使用lua语言,三者都是使用css或者类css布局,这点都很像,三者都可以使用原生(IOS.android)语言做一部分功能,比如有特殊性能要求的地方,就使用原生代码写

当项目需要使用Hibernate框架技术时,对项目进行的配置

1.在需要使用Hibernate框架技术的项目上单击鼠标右键,在弹出的菜单中选择MyEclipse-->Add Hibernate Capabilities,打开Add Hibernate Capabilities对话框 2.在Hibernate Specification后面的单选按钮中选择你需要使用的Hibernate框架的版本,我这里使用的是Hibernate 3.1版本,然后点击Next>按钮进行下一步操作: 3.点击Next>进行下一步操作: 4.在下图中的DB Driver: