从记录中获取属性

Get attribute from record

我正在寻找一种方法来获取在记录构造函数“字段”上定义的属性。

// See https://aka.ms/new-console-template for more information

using System.ComponentModel.DataAnnotations;

var property = typeof(TestRecord)
               .GetProperties()
               .First( x => x.Name == nameof(TestRecord.FirstName) );

var attr0 = property.Attributes; // NONE
var attr1 = property.GetCustomAttributes( typeof(DisplayAttribute), true ); // empty

var property1 = typeof(TestRecord)
                .GetProperties()
                .First( x => x.Name == nameof(TestRecord.LastName) );

var attr2 = property1.Attributes; // NONE
var attr3 = property1.GetCustomAttributes( typeof(DisplayAttribute), true ); // Works

public sealed record TestRecord( [Display] String FirstName, [property: Display] String LastName );

我能够在 LastName 上获取针对 属性 的属性(使用 property:)。

但我找不到检索 FirstName 属性的方法。

我确定有一种方法可以读取属性数据...至少 ASP.NET 能够读取验证并显示指定的属性,而无需针对 属性(property:).

您看错地方了:在 C# 中使用“braceless”record 语法时,成员的属性实际上是 参数属性.

您可以像这样从 [Display] String FirstName 获取 DisplayAttribute

ParameterInfo[] ctorParams = typeof(TestRecord)
    .GetConstructors()
    .Single()
    .GetParameters();
        
DisplayAttribute firstNameDisplayAttrib = ctorParams
    .Single( p => p.Name == "FirstName" )
    .GetCustomAttributes()
    .OfType<DisplayAttribute>()
    .Single();