Я ищу способ получить атрибут, определенный в «поле» конструктора записи.
// 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:
).
Поскольку ваш тип record
был скрыт ниже сгиба в области кода прокрутки StackOverflow, я сначала вообще не мог его увидеть, и у вас было непоследовательное отрицание и не было правильных подсказок на языке кода в вашем сообщении. Кроме того, не все используют VS2022.
DisplayAttribute
на NotNullAttribute
(поскольку DataAnnotations
нельзя легко использовать в Sharplab). Если вы посмотрите на декомпилированный код, то увидите, что этот атрибут используется только внутри конструктора, но не в самом свойстве.
Если вы хотите поместить атрибут в сгенерированное свойство, используйте [property: Display] string FirstName
Вы ищете не в том месте: при использовании «бесскобочного» синтаксиса record
в C# атрибуты, помещаемые в члены, на самом деле имеют значение атрибуты параметров.
Вы можете получить DisplayAttribute
из [Display] String FirstName
следующим образом:
ParameterInfo[] ctorParams = typeof(TestRecord)
.GetConstructors()
.Single()
.GetParameters();
DisplayAttribute firstNameDisplayAttrib = ctorParams
.Single( p => p.Name == "FirstName" )
.GetCustomAttributes()
.OfType<DisplayAttribute>()
.Single();
@Dai Почему вы редактируете совершенно правильный и компилируете код C#? См. docs.microsoft.com/en-us/dotnet/core/tutorials/…