谈谈C#中的特性:在.net core中的应用
前言
在ASP.NET CORE mvc中,我们在过滤器的注册方式上,常用方法之一就是在Action上以特性的标注的方式进行注册,如以下形式:
[AuthonizationFilter()]
public IActionResult Index()
{
return View();
}
这其中的[AuthonizationFilter()]就是特性。所以在C#中特性究竟是怎样一种机制?本文将对此进行探讨。
什么是特性?
来看看微软官方对于C#中特性的定义:
使用特性,可以有效地将元数据或声明性信息与代码(程序集、类型、方法、属性等)相关联。 将特性与程序实体相关联后,可以在运行时使用反射这项技术查询特性。 有关详细信息,请参阅反射 (C#)。
习惯性的,微软官方的话总是太官方,说通俗一点就是:特性可以对程序集、类型、方法、属性等进行声明,约束,关联。
如何更深的理解呢?且听慢慢分解。
特性具有如下属性:
- 特性向程序添加元数据。 元数据是程序中定义的类型的相关信息。 所有 .NET 程序集都包含一组指定的元数据,用于描述程序集中定义的类型和类型成员。 可以添加自定义特性来指定所需的其他任何信息。 有关详细信息,请参阅创建自定义特性 (C#)。
- 可以将一个或多个特性应用于整个程序集、模块或较小的程序元素(如类和属性)。
- 特性可以像方法和属性一样接受自变量。
- 程序可使用反射来检查自己的元数据或其他程序中的元数据。 有关详细信息,请参阅使用反射访问特性 (C#)。
说了一大堆,还是来看看怎么用吧,光说不练假把式。
使用特性
在 C# 中,特性是继承自 Attribute
基类的类。 所有继承自 Attribute
的类都可以用作其他代码块的一种“标记”。 例如,有一个名为 ObsoleteAttribute
的特性。 它用于示意代码已过时,不得再使用。 可以将此特性应用于类(比如说,使用方括号)。
[Obsolete]
public class MyClass
{
}
请注意,虽然此类的名称为 ObsoleteAttribute
,但只需在代码中使用 [Obsolete]
。 这是 C# 遵循一项约定。 如果愿意,也可以使用全名 [ObsoleteAttribute]
。(约定大于配置原则)
如果将类标记为已过时,最好说明已过时的原因和/或改用的类。 为此,可将字符串参数传递给 Obsolete 特性。
[Obsolete("ThisClass is obsolete. Use ThisClass2 instead.")]
public class ThisClass
{
}
此字符串会作为自变量传递给 ObsoleteAttribute
构造函数,就像在编写 var attr = new ObsoleteAttribute("some string")
一样。
只能向特性构造函数传递以下简单类型/文本类型参数:bool, int, double, string, Type, enums, etc
和这些类型的数组。 不能使用表达式或变量。 可以使用任何位置参数或已命名参数。
MVC中使用特性
在mvc中特性最经典的用法之一就是以特性的方式进行过滤器的注册
在控制器中
[AuthonizationFilter()]
public class FirstController : Controller
{
private ILogger<FirstController> _logger;
public FirstController(ILogger<FirstController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
return View();
}
}
在Action上
[AuthonizationFilter()]
public IActionResult Index()
{
return View();
}
在model上
其实就是DataAnnotations,这是一种以特性标注的方式对属性进行约束声明
public int Id { get; set; }
[Display(Name = "专辑名")]
public string Title { get; set; }
[Display(Name = "艺人")]
public string Artist { get; set; }
[Display(Name = "发行日期")]
public DateTime ReleaseDate { get; set; }
[Display(Name = "价格")]
public decimal Price { get; set; }
[Display(Name = "封面地址")]
public string CoverUrl { get; set; }
public List<AlbumSong> AlbumSongs { get; set; }
更多关于 ASP.NET CORE MVC 中的过滤器论述,请移步我的文章:https://blog.csdn.net/weixin_41372626/article/details/106040531
特性的用法总结:
应用方式都很简单就是将特性放置在目标元素前的一对方括号中。
应用特性时,C#允许用一个前缀明确指定特性要应用于的目标元素。
[type:SomeAttr]//应用于类型
public class People<[typevar:SomeAttr]T> {//应用于泛型
[field:SomeAttr]//应用于字段
public Int32 age;
[return:SomeAttr]//应用于返回值
[method:SomeAttr]//应用于方法
public Int32 Eat(
[param:SomeAttr]//应用于参数
String foodName) {
return 1;
}
[property:SomeAttr]//应用于属性
public String SomeProp {
[method:SomeAttr]//应用于访问器方法
get { return null; }
}
[event: SomeAttr]//应用于事件
[field: SomeAttr]//应用于编译器生成的字段
[method:SomeAttr]//应用于编译器生成的add和remove方法
public event EventHandler DieEvent;
}
参考文献:
微软官方文档https://docs.microsoft.com/zh-cn/dotnet/csharp/tutorials/attributes
韩子卢:C# 特性 https://www.cnblogs.com/vvjiang/
推荐阅读
-
谈谈C#中的特性:在.net core中的应用
-
谈谈ASP.NET Core MVC设计中的Controller与Action设计规范
-
C#中简单操作SQLserver数据库(ADO.NET的简单应用)
-
微服务统计,分析,图表,监控一体化的HttpReports项目在.Net Core 中的使用
-
Hangfire在ASP.NET CORE中的简单实现方法
-
C# lambda表达式应用如何找出元素在list中的索引
-
C#中委托和事件在观察者模式中的应用实例
-
C# lambda表达式应用如何找出元素在list中的索引
-
关于C# 5.0 CallerMemberName CallerFilePath CallerLineNumber 在.NET4中的使用介绍方法
-
asp.net Checbox在GridView中的应用实例分析