如何在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
相关产品推荐
相关产品推荐

