欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

谈谈C#中的特性:在.net core中的应用

程序员文章站 2024-01-04 12:44:40
...

前言

在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#

上一篇:

下一篇: