在創建自定義屬性時,會創建一個從 ValidationAttribute 類擴展的自定義類。
public class CustomAttribute: ValidationAttribute
{
public void Test()
{
Console.WriteLine("Hello World");
}
public override bool IsValid(object? value)
{
//Logic here
if (condition)
{
return true;
}
else
return false;
}
}
假設這個自定義屬性位于模型的屬性之上。
[Custom]
public string username { get; set; }
通過將自定義放置在屬性上,我正在實體化自定義類。現在我的查詢是
- 如何以及何時呼叫 IsValid() 方法?
- 為什么不呼叫 CustomAttribute 類中的其他方法?(在這種情況下為 Test() 方法)
- 在 CustomAttribute 類中運行特定方法的依據是什么?
uj5u.com熱心網友回復:
通過放置
[Custom]我正在實體化Custom類的屬性。
不,這是不正確的。
AttributeGetCustomAttributes()只有在您使用這些方法時才會創建實體(并呼叫它們的建構式) 。這在這里討論:自定義屬性的建構式何時運行?
如何以及何時
IsValid()呼叫該方法?
只有當某些驗證服務(可能是任何東西!)故意選擇尋找ValidationAttribute使用的子類GetCustomAttributes() 并且它也專門使用時IsValid()。
為什么
CustomAttribute不呼叫類中的其他方法?(在這種情況下Test()方法)
因為您發布的任何代碼都沒有顯示任何CustomAttribute通過反射實體化并呼叫.Test()它們的嘗試。
在
CustomAttribute類中運行特定方法的依據是什么?
只有當屬性被實體化GetCustomAttributes() 并且消費者(呼叫程式)被專門撰寫為使用[CustomAttribute].
uj5u.com熱心網友回復:
你的理解基礎不正確。您假設在這里有效的是Attribute您需要專注于代碼行為。
屬性是“資料”類——它們不是自己行動的。
它們在執行Reflection類和屬性時很有用。
在 DLL 或 EXE 中,您可以在作業中看到這些資料。屬性有助于“標記”某些事物,我建議更多地了解反射。
對于您的問題:
IsValid被框架或者你自己呼叫,需要Attribute專門提取這些型別并呼叫IsValid. 一個很好的提示是override關鍵字 - 意味著其他東西管理這種行為。- 雖然這是可能的 - 通過反射提取所有公共方法并呼叫它們,但框架并非旨在呼叫自定義公共方法,因為它不安全、意外且通常不推薦使用。
- 在框架的基礎上——如果一個框架被設計為呼叫這些方法,那么他們就會呼叫它們,否則它根本不會關心你定義了什么方法。
例如,讓我們假設這個愚蠢的屬性:
public class MyAttrib : ValidationAttribute
{
public MyAttrib()
{
Console.WriteLine("Hello from attrib ctor");
}
public override bool IsValid(object? value)
{
if (value == null) return false;
if (value != null && value.GetType() != typeof(string))
{
return false;
}
string? s = value as string;
return s == "Hello World";
}
}
[MyAttrib]
public class A
{
}
實作框架需要做這樣的事情:
var assm = Assembly.GetExecutingAssembly();
foreach (var type in assm.GetTypes())
{
if (type.IsAssignableFrom(typeof(A)))
{
Console.WriteLine($"Found type {type}");
var attributeType = type.GetCustomAttribute<MyAttrib>();
var isValid = attributeType.IsValid("Hello World");
Console.WriteLine($"Is Valid? {isValid}");
}
}
我更關注反射,因為這是理解屬性的關鍵。
關于像 ASP.net 這樣的框架:這些框架廣泛Reflection用于執行許多任務并將行為“委托”給用戶代碼。
一個有趣的實驗是在您的方法上放置斷點override并查看它們在代碼中被呼叫的位置。還要檢查不同的屬性和它們有什么,它們的基礎是標記某些資料或行為,比如對ValidationAttribute資料執行驗證。
祝你好運!
uj5u.com熱心網友回復:
知道 ValidationAttributes 的系統不知道您的 Test 方法。它確實知道 IsValid 方法 - 這就是您需要覆寫它的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/511412.html
標籤:C#网.net-core
上一篇:搜索輸入系統
