C# derived Attributes 在内部是如何工作的?什么时候调用它里面的方法来作用于声明它们的 class/method/property?
How do C# derived Attributes work internally?When are the methods inside it called to act upon the class/method/property on which they are declared?
我正在编写 MVC 代码,我在模型上使用了 ValidationAttributes,例如 - RequiredAttribute、RangeAttribute 等。我只是不明白它们在内部是如何工作的。我有一个从 ValidationAttribute 派生的 CustomAttribute,其中 IsValid 被覆盖并且一些自定义检查是 made.When 我在我的 CustomAttribute 上放置了断点,它在更新模型时被调用,这是有道理的。但是我不明白对象从哪里传递给属性。调用方法的方式和原因。
1.In Visual Studio 我一直在检查属性的定义,似乎缺少一些东西。应用属性的对象如何传递给属性class/object(属性对象甚至实例化了吗?)
2.I 进入我的目录 - C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.7 并将 System.ComponentModel.DataAnnotations.dll 拖入 justdecompile window。我根本看不到任何实现。 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);
}
}
以上是在 Required 属性上按 F12 时的元数据。这里 IsValid 有一个值参数。但是没有代码显示它的调用或参数被传递到哪里。
我希望看到的答案是一个示例代码,其中可能包含应用于 method/property(如适用)的 Required/Range/Conditional 属性,然后逐步说明该属性何时实际执行工作或者如果它不是属性那么工作在哪里完成。
框架自动调用 IsValid 方法。
它使用反射在您指定的 class 中搜索从 ValidationAttribute 派生的所有属性,并调用它们的 IsValid 方法。
但这是一个特例。如果您创建一个直接从 Attribute 派生的自定义属性,您必须自己调用它。
具体工作流程可以在ASP.NET的源码中搜索,喜欢的可以搜索:https://github.com/aspnet/AspNetWebStack
我正在编写 MVC 代码,我在模型上使用了 ValidationAttributes,例如 - RequiredAttribute、RangeAttribute 等。我只是不明白它们在内部是如何工作的。我有一个从 ValidationAttribute 派生的 CustomAttribute,其中 IsValid 被覆盖并且一些自定义检查是 made.When 我在我的 CustomAttribute 上放置了断点,它在更新模型时被调用,这是有道理的。但是我不明白对象从哪里传递给属性。调用方法的方式和原因。
1.In Visual Studio 我一直在检查属性的定义,似乎缺少一些东西。应用属性的对象如何传递给属性class/object(属性对象甚至实例化了吗?) 2.I 进入我的目录 - C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.7 并将 System.ComponentModel.DataAnnotations.dll 拖入 justdecompile window。我根本看不到任何实现。 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);
}
}
以上是在 Required 属性上按 F12 时的元数据。这里 IsValid 有一个值参数。但是没有代码显示它的调用或参数被传递到哪里。
我希望看到的答案是一个示例代码,其中可能包含应用于 method/property(如适用)的 Required/Range/Conditional 属性,然后逐步说明该属性何时实际执行工作或者如果它不是属性那么工作在哪里完成。
框架自动调用 IsValid 方法。 它使用反射在您指定的 class 中搜索从 ValidationAttribute 派生的所有属性,并调用它们的 IsValid 方法。
但这是一个特例。如果您创建一个直接从 Attribute 派生的自定义属性,您必须自己调用它。
具体工作流程可以在ASP.NET的源码中搜索,喜欢的可以搜索:https://github.com/aspnet/AspNetWebStack