前言

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# 属性类(特性)的更多相关文章

  1. Python学习:17.Python面向对象(四、属性(特性),成员修饰符,类的特殊成员)

    一.属性(特性) 普通方法去执行的时候,后面需要加括号,特性方法执行的时候和静态字段一样不需要不需要加括号. 特性方法不和字段同名. 特性方法不能传参数. 在我们定义数据库字段类的时候,往往需要对其中 ...

  2. 深入理解JavaScript中的属性和特性

    深入理解JavaScript中的属性和特性 JavaScript中属性和特性是完全不同的两个概念,这里我将根据自己所学,来深入理解JavaScript中的属性和特性. 主要内容如下: 理解JavaSc ...

  3. JavaScript之面向对象的概念,对象属性和对象属性的特性简介

    一.大家都知道,面向对象语言有一个标志,那就是他们都有类的概念,通过类我们可以创建任意多个具有相同属性和方法的对象.但ECMAScript(指定JavaScript标准的机构,也就是说JavaScri ...

  4. .NET Framework的属性类对控件的支持功能

     ToolBoxItem 此属性为类特性.属于工具箱属性,可以设置当前控件是否在工具箱中显示,以及所在工具箱项的类型名称等信息.默认生成的控件都显示在工具箱中. 更多设计时属性介绍: 4.3 属性的 ...

  5. 其他css属性和特性

    其他css属性和特性 设置元素的颜色和透明度 下表列出了这些属性. 颜色相关属性 属 性 说 明 值 color 设置元素的前景色 <颜色> opacity 设置颜色的透明度 <数值 ...

  6. JS魔法堂:属性、特性,傻傻分不清楚

    一.前言 或许你和我一样都曾经被下面的代码所困扰 var el = document.getElementById('dummy'); el.hello = "test"; con ...

  7. javascript中对象的属性的特性

    1.ES5的属性特性包括下面六个: configurable: 表示能否通过delete来删除属性从而重新定义属性,能够修改属性的特性,默认为true enumberable: 表示是否能通过for- ...

  8. javascript 属性的特性

    /* 属性的特性: 可以通过调用Object.getOwnPropertyDescriptor()可以获得某个对象特定属性的属性描述符, 从函数名字就可以看出, Object.getOwnProper ...

  9. javaScript 工作必知(八) 属性的特性 值、写、枚举、可配置

    属性的特性 每个对象都拥有属性,属性具有哪些特性呢? 1.属性具有值.  2.属性是否是可写的.            3.是否是可枚举的.            4.是否是可配置的.   " ...

  10. java中dao层的通用层,通过反射机制,操作数据库的增删改,适用的范围是不包含属性类

    这里首先必须注意的是:类的类名.字段必须与数据库中的表名和字段名保持一致,否则无法通过反射机制作出通用层 /** * 学生信息类,数据库中的StuInfo表 * */public class StuI ...

随机推荐

  1. Djiango视图层和模型层

    Djiango 使用教程 目录 Djiango 使用教程 一. 视图层 1.1 HttpResponse,render,redirect 1.2 JsonResponse 1.3 form表单上传文件 ...

  2. Kali 获取任意设备信息

    注意:仅供测试 请勿商用 可获取对方位置 误差小于500m 访问摄像头 访问麦克风 一. 安装环境 #01 mac 安装虚拟机 下载地址:https://www.macyy.cn/archives/1 ...

  3. [VueJsDev] 快速入门 - vscode 自动格式化

    [VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html vscode 自动格式化(vue) ::: details ...

  4. AMD Intel CPU 对比图

  5. 学习笔记-涛讲F#(中级)

    目录 适配器模式 责任链模式 命令模式 策略模式 工厂模式 单例模式 其它内容 这一系列的视频主要讲了F#设计模式的实现,没有太多其它内容,笔记内容主要是转载Snippets tagged desig ...

  6. git 删除本地创建的仓库常用方法

    基本方法   清除本地文件夹下的git文件,然后在重新初始化新建的git仓库 具体实施 //删除文件夹下的所有 .git 文件 find . -name ".git" | xarg ...

  7. Spring之事务传播属性

    在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量. 在使用Spring时,大部分会用到他的声明式事务,简单的在配置文件中进行一些规则 ...

  8. C++ 传递数组引用

    不用额外变量可以在函数中得到数组长度信息,函数的形参声明为数组引用 #include <iostream> using namespace std; void f(int(&a) ...

  9. 3、Azure Devops之Azure Repos篇

    1.什么是Azure Repos Azure Repos,就是我们常说的代码仓库,相当于gitee,github,git,svn工具.主要是提供给开发人员使用的,管理.查看代码的部件.通过Files. ...

  10. 如何让AR物体更真实?

    在增强现实中,除了虚拟物体本身的模型材质等因素,影响物体真实性的主要是光照.反射.阴影.接下来3DCAT实时渲染云平台将带您从这三个方面探索如何让AR物体更真实! AR光估测 要让一个虚拟物体很好的融 ...