c# 属性类(特性)
前言
c# 属性类也称做特性。这是一篇垫文,为后面的过滤器和其他特性类的东西做铺垫。
正文
看一段代码:
static void Main(string[] args)
{
Attribitefunc1.printMesssage("卡特林");
Console.ReadLine();
}
/// <summary>
/// Attribitefunc1 is class that provite a print method
/// </summary>
public class Attribitefunc1{
[Conditional("release")]
public static void printMesssage(string msg)
{
Console.WriteLine("输出数据:"+ msg);
}
}
然后发现不会有任何输出;
然后我加上#define release;
结果:

那么我们明白原来这个是否执行是根据是否预处理来判断的,这使得我们程序变得很方便。
再举一个例子:
我们在开发一个项目中,如果我们废弃了代码,我们是不会去立即删除的,因为需要回顾历史。
static void Main(string[] args)
{
Attribitefunc1.printMesssage("卡特林");
Console.ReadLine();
}
/// <summary>
/// Attribitefunc1 is class that provite a print method
/// </summary>
public class Attribitefunc1{
[Obsolete("this is old",true)]
public static void printMesssage(string msg)
{
Console.WriteLine("输出数据:"+ msg);
}
}
这时候显示的是:

当然有时候我们是不会让他报错的,只需要警告。
[Obsolete("this is old",false)]

好了,既然属性这么好用不如我们就来自定义吧!
就用验证来举例子吧!
[AttributeUsage(AttributeTargets.Property,AllowMultiple =true,Inherited =true)]
public abstract class BaseAttribute:Attribute
{
public virtual string error { get; set; }
public abstract bool Validate(object value);
}
要实现属性就要继承属性!
在属性类上我们可以加一些特性,AttributeUsage。
比如说:
AttributeTargets 表示的是作用于什么位置,你可以限制是类或者属性等等。
AllowMultiple 是否可以有多个属性,因为验证有验证是否为空、验证是长度等等,需要为true。
Inherited 这个是否可继承,一般是可继承的。
下面以不为空来举例:
public class RequiredAttribute : BaseAttribute
{
public override string error {
get {
if (base.error != null)
{
return base.error;
}
return "属性不能为空";
}
set { base.error = value;
}
}
public override bool Validate(object value)
{
return !(value == null);
}
}
上面我继承了BaseAttribute,实现BaseAttribute里面的方法和属性。
下面我又一个student类:
public class Student
{
private string name;
[Required]
public string Name { get => name; set => name = value; }
}
那么我给Name值不能为空的属性。
同样我们要去实现验证过程,为了解耦,需要加一个helper类;
public class ValidateHelper
{
public static string Validate<T>(T t)
{
Type type = t.GetType();
PropertyInfo[] propertyInfos = type.GetProperties(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic);
foreach (PropertyInfo propertyInfo in propertyInfos)
{
if (propertyInfo.IsDefined(typeof(BaseAttribute)))
{
foreach (BaseAttribute attribute in propertyInfo.GetCustomAttributes(typeof(BaseAttribute)))
{
if (!attribute.Validate(propertyInfo.GetValue(t, null)))
{
return attribute.error;
}
}
}
}
return null;
}
}
上面的原理非常简单,就是遍历一个泛型里面的属性,找到里面的特性进行判断。
我们需要书写的判断过程如下:
Student student = new Student();
var errormessage=ValidateHelper.Validate(student);
Console.WriteLine(errormessage);
Console.ReadKey();
得到的结果:

介绍完毕!
c# 属性类(特性)的更多相关文章
- Python学习:17.Python面向对象(四、属性(特性),成员修饰符,类的特殊成员)
一.属性(特性) 普通方法去执行的时候,后面需要加括号,特性方法执行的时候和静态字段一样不需要不需要加括号. 特性方法不和字段同名. 特性方法不能传参数. 在我们定义数据库字段类的时候,往往需要对其中 ...
- 深入理解JavaScript中的属性和特性
深入理解JavaScript中的属性和特性 JavaScript中属性和特性是完全不同的两个概念,这里我将根据自己所学,来深入理解JavaScript中的属性和特性. 主要内容如下: 理解JavaSc ...
- JavaScript之面向对象的概念,对象属性和对象属性的特性简介
一.大家都知道,面向对象语言有一个标志,那就是他们都有类的概念,通过类我们可以创建任意多个具有相同属性和方法的对象.但ECMAScript(指定JavaScript标准的机构,也就是说JavaScri ...
- .NET Framework的属性类对控件的支持功能
ToolBoxItem 此属性为类特性.属于工具箱属性,可以设置当前控件是否在工具箱中显示,以及所在工具箱项的类型名称等信息.默认生成的控件都显示在工具箱中. 更多设计时属性介绍: 4.3 属性的 ...
- 其他css属性和特性
其他css属性和特性 设置元素的颜色和透明度 下表列出了这些属性. 颜色相关属性 属 性 说 明 值 color 设置元素的前景色 <颜色> opacity 设置颜色的透明度 <数值 ...
- JS魔法堂:属性、特性,傻傻分不清楚
一.前言 或许你和我一样都曾经被下面的代码所困扰 var el = document.getElementById('dummy'); el.hello = "test"; con ...
- javascript中对象的属性的特性
1.ES5的属性特性包括下面六个: configurable: 表示能否通过delete来删除属性从而重新定义属性,能够修改属性的特性,默认为true enumberable: 表示是否能通过for- ...
- javascript 属性的特性
/* 属性的特性: 可以通过调用Object.getOwnPropertyDescriptor()可以获得某个对象特定属性的属性描述符, 从函数名字就可以看出, Object.getOwnProper ...
- javaScript 工作必知(八) 属性的特性 值、写、枚举、可配置
属性的特性 每个对象都拥有属性,属性具有哪些特性呢? 1.属性具有值. 2.属性是否是可写的. 3.是否是可枚举的. 4.是否是可配置的. " ...
- java中dao层的通用层,通过反射机制,操作数据库的增删改,适用的范围是不包含属性类
这里首先必须注意的是:类的类名.字段必须与数据库中的表名和字段名保持一致,否则无法通过反射机制作出通用层 /** * 学生信息类,数据库中的StuInfo表 * */public class StuI ...
随机推荐
- Djiango视图层和模型层
Djiango 使用教程 目录 Djiango 使用教程 一. 视图层 1.1 HttpResponse,render,redirect 1.2 JsonResponse 1.3 form表单上传文件 ...
- Kali 获取任意设备信息
注意:仅供测试 请勿商用 可获取对方位置 误差小于500m 访问摄像头 访问麦克风 一. 安装环境 #01 mac 安装虚拟机 下载地址:https://www.macyy.cn/archives/1 ...
- [VueJsDev] 快速入门 - vscode 自动格式化
[VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html vscode 自动格式化(vue) ::: details ...
- AMD Intel CPU 对比图
- 学习笔记-涛讲F#(中级)
目录 适配器模式 责任链模式 命令模式 策略模式 工厂模式 单例模式 其它内容 这一系列的视频主要讲了F#设计模式的实现,没有太多其它内容,笔记内容主要是转载Snippets tagged desig ...
- git 删除本地创建的仓库常用方法
基本方法 清除本地文件夹下的git文件,然后在重新初始化新建的git仓库 具体实施 //删除文件夹下的所有 .git 文件 find . -name ".git" | xarg ...
- Spring之事务传播属性
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量. 在使用Spring时,大部分会用到他的声明式事务,简单的在配置文件中进行一些规则 ...
- C++ 传递数组引用
不用额外变量可以在函数中得到数组长度信息,函数的形参声明为数组引用 #include <iostream> using namespace std; void f(int(&a) ...
- 3、Azure Devops之Azure Repos篇
1.什么是Azure Repos Azure Repos,就是我们常说的代码仓库,相当于gitee,github,git,svn工具.主要是提供给开发人员使用的,管理.查看代码的部件.通过Files. ...
- 如何让AR物体更真实?
在增强现实中,除了虚拟物体本身的模型材质等因素,影响物体真实性的主要是光照.反射.阴影.接下来3DCAT实时渲染云平台将带您从这三个方面探索如何让AR物体更真实! AR光估测 要让一个虚拟物体很好的融 ...