C#特性

· 浏览次数 : 0

小编点评

**C#特性1. 概括** 特性是一种用于向代码元素添加元数据的机制,允许程序员在代码中添加额外的信息,以影响程序的行为、编译过程或提供其他元数据。 **2. 语法定义特性类应用特性获取特性** 语法定义特性类如下: ```csharp using System; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] public class MyCustomAttribute : Attribute { public string Description { get; } public MyCustomAttribute(string description) { Description = description; } } ``` **3. 应用场景数据验证序列化和反序列化描述性元数据依赖注入单元测试权限控制AOP** 在数据验证领域,可以使用特性来验证模型,在AOP中实现权限控制等功能。例如: ```csharp // 模型类 public class User { [Required] [StringLength(50)] public string Name { get; set; } [Range(18, 99)] public int Age { get; set; } } // 属性配置 public enum Status { Pending, Completed } ```

正文

C#特性

1. 概括

C#中的特性是一种用于向代码元素添加元数据的机制。它们允许程序员在代码中添加额外的信息,以影响程序的行为、编译过程或提供其他元数据。特性在编写现代C#代码时变得越来越常见,因为它们提供了一种优雅的方法来实现元数据驱动的开发。

特性分为:框架自带特性(如:[Required]、[Authorize]、[Route]、[HttpPost]等)和自定义特性,都继承System.Attribute

2. 语法

定义特性类

以下是一个简单的特性类定义示例:

using System;

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class MyCustomAttribute : Attribute
{
    public string Description { get; }

    public MyCustomAttribute(string description)
    {
        Description = description;
    }
}

应用特性

将特性应用到代码元素上,可以使用以下语法:

    [MyCustom("类使用自定义特性")]
    public class MyClass
    {
        [MyCustom("方法使用自定义特性")]
        public void MyMethod()
        {
        }
    }

获取特性

要获取 MyCustom 特性,您可以使用反射来检查某个类型或成员上是否应用了该特性,并且访问该特性的属性。下面是如何获取 MyCustom 特性的示例代码:


// 获取 MyClass 类上的 MyCustom 特性
var classAttributes = typeof(MyClass).GetCustomAttributes(typeof(MyCustomAttribute), false);
foreach (MyCustomAttribute attribute in classAttributes)
{
    Console.WriteLine($"MyClass类使用的MyCustom特性: {attribute.Description}");
}

// 获取 MyClass 类中 MyMethod 方法上的 MyCustom 特性
var methodInfo = typeof(MyClass).GetMethod("MyMethod");
var methodAttributes = methodInfo.GetCustomAttributes(typeof(MyCustomAttribute), false);
foreach (MyCustomAttribute attribute in methodAttributes)
{
    Console.WriteLine($"MyMethod方法使用的MyCustom特性: {attribute.Description}");
}

3. 应用场景

数据验证

在模型类上应用特性,以进行数据验证。例如,使用DataAnnotations中的特性来验证模型:

public class User
{
    [Required]
    [StringLength(50)]
    public string Name { get; set; }

    [Range(18, 99)]
    public int Age { get; set; }
}

序列化和反序列化

控制对象的序列化和反序列化过程。例如,使用Json.NET中的特性来指定JSON属性的名称和行为:

public class Product
{
    [JsonProperty("product_name")]
    public string Name { get; set; }

    [JsonIgnore]
    public decimal Price { get; set; }
}

描述性元数据

为枚举值或其他代码元素添加描述信息。例如,使用DescriptionAttribute为枚举值添加描述信息:

public enum Status
{
    [Description("The task is pending")]
    Pending,

    [Description("The task is completed")]
    Completed
}

依赖注入

在依赖注入容器中标记服务以进行注入。例如,在ASP.NET Core中,使用[Inject]特性标记需要注入的服务:

[Inject]
public class MyService
{
    // This property will be injected by the DI container
}

单元测试

在单元测试框架中使用特性标记测试方法。例如,在NUnit中使用[Test]特性标记测试方法:

[Test]
public void TestMethod()
{
    // Test code here
}

权限控制

使用特性进行权限控制。例如,在ASP.NET Core中使用[Authorize]特性标记需要授权的控制器或操作方法:

[Authorize(Roles = "Admin")]
public class AdminController : Controller
{
    // Only accessible to users in the Admin role
}

AOP(面向切面编程)

通过特性实现AOP,如日志记录、事务管理等。例如,在ASP.NET Core中使用ActionFilterAttribute来实现日志记录:

public class LogActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        // Log action execution start
        base.OnActionExecuting(context);
    }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        // Log action execution end
        base.OnActionExecuted(context);
    }
}

总结

C#中的特性为程序员提供了一种强大的元数据驱动机制,可以应用于多种场景。通过在代码中定义和使用特性,可以增强代码的可读性、可维护性,并提供灵活的方式来控制程序的行为和属性。

引用

  1. 博文示例代码 https://github.com/chi8708/DotNetNote/blob/master/Note.Basic/11Attribute.cs

与C#特性相似的内容:

C#特性

目录C#特性1. 概括2. 语法定义特性类应用特性获取特性3. 应用场景数据验证序列化和反序列化描述性元数据依赖注入单元测试权限控制AOP(面向切面编程)总结引用 C#特性 1. 概括 C#中的特性是一种用于向代码元素添加元数据的机制。它们允许程序员在代码中添加额外的信息,以影响程序的行为、编译过程

【算法】游戏中的学习,使用c#面向对象特性控制游戏角色移动

最近,小悦的生活像是一首繁忙的交响曲,每天忙得团团转,虽然她的日程安排得满满当当,但她并未感到充实。相反,她很少有时间陪伴家人,这让她感到有些遗憾。在周五的午后,小悦的哥哥突然打来电话,他的声音里充满了焦虑。 “小悦,我有个事情想拜托你。”哥哥的声音传来。 小悦不禁有些疑惑,哥哥有什么事情需要她帮忙

C++20起支持的一个小特性

注释掉的为传统的写法,从C++20起支持default关键字修饰的写法,即使是成员变量有多个的时候也支持,减轻了程序员的心智负担。

C++的模板类在HotSpot VM中的应用

模板是c++的一种特性,允许函数或者类通过泛型(generic types)的形式表现或者运行。模板可以使得函数或类在对应不同的类型(types)的时候正常工作,而无需为每一种类型分别写一份代码。 在HotSpot VM中定义了一些模板类,有了这些模板类,我们就可以和Java一样进行泛型编程。Hot

Dart常用核心知识

Dart简述 Dart 是一个为全平台构建快速应用的客户端优化的编程语言,免费且开源。 Dart是面向对象的、类定义的、单继承的语言。它的语法涵盖了多种语言的语法特性,如C,JavaScirpt, Java, Swift等语言,可以转译为JavaScript,支持接口(interfaces)、混入(

C# 13(.Net 9) 中的新特性 - 扩展类型

C# 13 即 .Net 9 按照计划会在2024年11月发布,目前一些新特性已经定型,今天让我们来预览一个比较大型比较重要的新特性: 扩展类型 extension types

C++的动态分派在HotSpot VM中的重要应用

众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。C++ 和 Java 作为当前最为流行的两种面向对象编程语言,其内部对于多态的支持对于单继承的实现非常类似。 首先来体现一下C++的动态分派,如下: class Base1{ pub

C#的重载决策

重载是许多编程语言支持的特性。所谓重载,就是指可以定义多个名称相同但参数(个数、类型和顺序)不同的方法(函数)。先来看一个例子: ```c# void Main() { char cvalue = 'a'; male m = new male(); m.write(cvalue); } class

C++ 多级继承与多重继承:代码组织与灵活性的平衡

C++ 多级继承 多级继承是一种面向对象编程(OOP)特性,允许一个类从多个基类继承属性和方法。它使代码更易于组织和维护,并促进代码重用。 多级继承的语法 在 C++ 中,使用 : 符号来指定继承关系。多级继承的语法如下: class DerivedClass : public BaseClass1

C# 9.0 添加和增强的功能【基础篇】

在 C# 9.0 中又诞生了比较多的特性(feature),这些特性确实大大简化了我们编码的代码量,但有一些东西改变了我们对 C# 的认知,那么本文就简单介绍下。