前言

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. Arrays.asList的坑

    Arrays.asList 方法的坑 此方法接受可变个数的参数 构建一个ArrayList 可此ArrayList 非彼ArrayList ,他返回的是 Arrays 的一个内部类,实现了Abstra ...

  2. 苹果AppleMacOs系统Sonoma本地部署无内容审查(NSFW)大语言量化模型Causallm

    最近Mac系统在运行大语言模型(LLMs)方面的性能已经得到了显著提升,尤其是随着苹果M系列芯片的不断迭代,本次我们在最新的MacOs系统Sonoma中本地部署无内容审查大语言量化模型Causallm ...

  3. JS3-高级事件

    获取事件和处理事件的第二种方式:事件监听 如何获取和处理鼠标与键盘的基本事件? 事件监听方式 eventTarget.addEventListener(type,listener[,useCaptur ...

  4. vscode vue 鼠标Ctrl+单击 函数跳转 插件名称:vue-helper

  5. C#实现软件开机自启动(不需要管理员权限)

    目录 原理简介 使用方法 完整代码 原理简介 本文参考C#/WPF/WinForm/程序实现软件开机自动启动的两种常用方法,将里面中的第一种方法做了封装成AutoStart类,使用时直接两三行代码就可 ...

  6. Android 语音播放(文字TTS)

    原文地址:Android 语音播放(文字TTS) | Stars-One的杂货小窝 基于Google内置的TTS引擎,封装了个语音播放的工具类 使用 //初始化 SpeechService.init( ...

  7. 公开的Webservice集锦

    备注:以下所有的来自 互联网,版权归原作者所有 股票行情数据 WEB 服务(支持香港.深圳.上海基金.债券和股票:支持多股票同时查询) Endpoint: http://webservice.webx ...

  8. makefile 编写要点

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  9. FreeRTOS教程8 任务通知

    1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCO ...

  10. 那位拿了多个Offer的大佬分享了最新Go面经

    和大家分享一下我们 Go就业训练营 和 升职加薪星球 中战友们投稿的真实面经. 这是第一篇,计划还会再更新4篇最新Go面经,都是拿到Offer的那种! 欢迎大家关注我的账号,关注之后不迷路. 先秀战绩 ...