Как производные атрибуты C # работают внутренне? Когда методы внутри него вызываются для воздействия на класс / метод / свойство, для которого они объявлены? - PullRequest
0 голосов
/ 02 июня 2019

Я писал код MVC, где я использовал ValidationAttributes для модели, например - RequiredAttribute, RangeAttribute и т. Д. Я просто не понимаю, как они работают внутренне.У меня есть CustomAttribute, производный от ValidationAttribute, где IsValid был переопределен и была сделана некоторая пользовательская проверка. Когда я ставил точку останова на свой CustomAttribute, он вызывался при обновлении модели, что имеет смысл.Однако я не понимаю, где объект передается в атрибут.Как и почему вызывается метод.

1. В Visual Studio я продолжаю проверять определения атрибутов, и, кажется, что-то не хватает.Как объект, к которому применяется атрибут, передается в класс / объект атрибута (является ли объект атрибута даже созданным?) 2. Я зашел в мой каталог - C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFramework \v4.7 и перетащил System.ComponentModel.DataAnnotations.dll в только что откомпилированное окно.Я не вижу никаких реализаций вообще.IsValid имеет пустое тело.

namespace System.ComponentModel.DataAnnotations
{
    //
    // Summary:
    //     Specifies that a data field value is required.
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
    public class RequiredAttribute : ValidationAttribute
    {
        //
        // Summary:
        //     Initializes a new instance of the System.ComponentModel.DataAnnotations.RequiredAttribute
        //     class.
        public RequiredAttribute();

        //
        // Summary:
        //     Gets or sets a value that indicates whether an empty string is allowed.
        //
        // Returns:
        //     true if an empty string is allowed; otherwise, false. The default value is false.
        public bool AllowEmptyStrings { get; set; }

        //
        // Summary:
        //     Checks that the value of the required data field is not empty.
        //
        // Parameters:
        //   value:
        //     The data field value to validate.
        //
        // Returns:
        //     true if validation is successful; otherwise, false.
        //
        // Exceptions:
        //   T:System.ComponentModel.DataAnnotations.ValidationException:
        //     The data field value was null.
        public override bool IsValid(object value);
    }
}

Приведенный выше текст взят из метаданных при нажатии F12 для атрибута Required.Здесь IsValid имеет значение параметра.Но нет кода, который показывает, куда передается его вызываемый или параметр.

В качестве ответа я хотел бы увидеть пример кода, отсекаемый с возможно обязательным / Range / Conditional Attribute, примененным к методу / свойству (в зависимости от обстоятельств) и затем шаг за шагом, когда Атрибут действительно выполняет работу или если это не атрибут, то где выполняется работа.

1 Ответ

0 голосов
/ 02 июня 2019

Вызов метода IsValid выполняется автоматически платформой. Он ищет в указанном вами классе все атрибуты, полученные из ValidationAttribute с использованием отражения, и вызывает их метод IsValid.

Но это особый случай. Если вы создаете пользовательский атрибут, который получается непосредственно из атрибута, вы должны вызывать его самостоятельно.

Вы можете найти точный рабочий процесс в исходном коде ASP.NET, если вам нравится: https://github.com/aspnet/AspNetWebStack

...