You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C# 11中通过反射读取required特性

如何通过反射读取C# 11的required特性

C# 11的required修饰符并不会映射到PropertyInfo.Attributes或TypeAttributes枚举值,它在编译后会被转换为**System.Runtime.CompilerServices.RequiredMemberAttribute特性**,因此需要通过反射检查该特性是否存在来判断成员是否为必填项。

完整示例代码

using System;
using System.Reflection;
using System.Runtime.CompilerServices;

class C1
{
    public int required P1 { get; set; }
    public required int F1;
}

class Program
{
    static void Main()
    {
        Type targetType = typeof(C1);
        
        // 检查属性是否为required
        PropertyInfo propertyInfo = targetType.GetProperty("P1");
        bool isPropertyRequired = propertyInfo.GetCustomAttribute<RequiredMemberAttribute>() != null;
        Console.WriteLine($"P1 is required: {isPropertyRequired}");
        
        // 检查字段是否为required
        FieldInfo fieldInfo = targetType.GetField("F1");
        bool isFieldRequired = fieldInfo.GetCustomAttribute<RequiredMemberAttribute>() != null;
        Console.WriteLine($"F1 is required: {isFieldRequired}");
        
        // 快速判断类型是否包含必填成员
        bool hasRequiredMembers = targetType.GetCustomAttribute<RequiredMembersAttribute>() != null;
        Console.WriteLine($"C1 has required members: {hasRequiredMembers}");
    }
}

关键说明

  • 对目标属性/字段调用GetCustomAttribute<RequiredMemberAttribute>(),返回值非空即表示该成员是required的。
  • 包含required成员的类会被编译器自动标记RequiredMembersAttribute,可通过该特性快速判断类是否存在必填成员,再逐个检查具体成员。
  • 需要引用System.Runtime.CompilerServices命名空间,否则无法访问对应的特性类。

内容的提问来源于stack exchange,提问作者Sayed Javad Seyedi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 15:27:34