Attribute.Match(Object) 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
在衍生類別中覆寫時,會傳回值,表示這個執行個體是否等於指定物件。
public:
virtual bool Match(System::Object ^ obj);
public virtual bool Match (object? obj);
public virtual bool Match (object obj);
abstract member Match : obj -> bool
override this.Match : obj -> bool
Public Overridable Function Match (obj As Object) As Boolean
參數
傳回
如果這個執行個體等於 obj
,則為 true
,否則為 false
。
備註
這個方法會判斷其中一個是否等於另一個 Attribute 。 其預設實作與 相同 Equals ,可判斷兩個屬性是否屬於相同類型,而且具有相同的域值。
一般而言, Equals 方法的目的是要執行標準測試以取得參考或值相等。 當您想要針對相等執行自訂比較時,您可以覆寫 Match 方法,此比較是以兩個屬性實例屬於相同類型且具有相同值的一些準則為基礎。 例如,您可以覆寫 Match 方法來比較下列案例中的屬性:
屬性包含位欄位,而且如果設定了特定位,您就會考慮兩個屬性實例相等。 例如,
NumericDisplay
屬性可能包含一個位欄位,指出用戶端支援的數值格式 (,例如二進位、八進位、十六進位和十六進位) 。 如果兩個實例支援相同的數值格式,覆寫 Match 方法可能會考慮兩個實例相等。屬性包含多個包含相同資訊類型的欄位,或包含可依任何順序排列值的陣列。 例如,
Author
屬性可能包含多個欄位以供作者名稱使用。 不論每個欄位是否等於對應的欄位,覆寫 Match 方法都可能會考慮兩個實例是否相等。
範例
下列範例說明 如何使用 Match 來建立屬性值的自訂比較方法。 如果 定義 AuthorsAttribute
內部包含 List<String>
儲存作者名稱的 。 因為名稱可以依照清單中的任何順序發生,所以它會覆寫 Match 方法來比較作者名稱,而不論其在清單中的位置為何。 請注意,執行 Equals 值相等測試的方法會從 Match 方法傳回不同的結果。
using System;
using System.Collections.Generic;
using System.Reflection;
// A custom attribute to allow multiple authors per method.
[AttributeUsage(AttributeTargets.Method)]
public class AuthorsAttribute : Attribute
{
protected List<string> _authors;
public AuthorsAttribute(params string[] names)
{
_authors = new List<string>(names);
}
public List<string> Authors
{
get { return _authors; }
}
// Determine if the object is a match to this one.
public override bool Match(object obj)
{
// Return false if obj is null or not an AuthorsAttribute.
AuthorsAttribute authors2 = obj as AuthorsAttribute;
if (authors2 == null) return false;
// Return true if obj and this instance are the same object reference.
if (Object.ReferenceEquals(this, authors2))
return true;
// Return false if obj and this instance have different numbers of authors
if (_authors.Count != authors2._authors.Count)
return false;
bool matches = false;
foreach (var author in _authors)
{
for (int ctr = 0; ctr < authors2._authors.Count; ctr++)
{
if (author == authors2._authors[ctr])
{
matches = true;
break;
}
if (ctr == authors2._authors.Count)
{
matches = false;
}
}
}
return matches;
}
public override string ToString()
{
string retval = "";
for (int ctr = 0; ctr < _authors.Count; ctr++)
{
retval += $"{_authors[ctr]}{(ctr < _authors.Count - 1 ? ", " : String.Empty)}";
}
if (retval.Trim().Length == 0)
{
return "<unknown>";
}
return retval;
}
}
// Add some authors to methods of a class.
public class TestClass {
[Authors("Leo Tolstoy", "John Milton")]
public void Method1()
{}
[Authors("Anonymous")]
public void Method2()
{}
[Authors("Leo Tolstoy", "John Milton", "Nathaniel Hawthorne")]
public void Method3()
{}
[Authors("John Milton", "Leo Tolstoy")]
public void Method4()
{}
}
class Example
{
static void Main()
{
// Get the type for TestClass to access its metadata.
Type clsType = typeof(TestClass);
// Iterate through each method of the class.
AuthorsAttribute authors = null;
foreach(var method in clsType.GetMethods())
{
// Check each method for the Authors attribute.
AuthorsAttribute authAttr = (AuthorsAttribute) Attribute.GetCustomAttribute(method,
typeof(AuthorsAttribute));
if (authAttr != null)
{
// Display the authors.
Console.WriteLine($"{clsType.Name}.{method.Name} was authored by {authAttr}.");
// Select Method1's authors as the basis for comparison.
if (method.Name == "Method1")
{
authors = authAttr;
Console.WriteLine();
continue;
}
// Compare first authors with the authors of this method.
if (authors.Match(authAttr))
{
Console.WriteLine("TestClass.Method1 was also authored by the same team.");
}
// Perform an equality comparison of the two attributes.
Console.WriteLine($"{authors} {(authors.Equals(authAttr) ? "=" : "<>")} {authAttr}");
Console.WriteLine();
}
}
}
}
// The example displays the following output:
// TestClass.Method1 was authored by Leo Tolstoy, John Milton.
//
// TestClass.Method2 was authored by Anonymous.
// Leo Tolstoy, John Milton <> Anonymous
//
// TestClass.Method3 was authored by Leo Tolstoy, John Milton, Nathaniel Hawthorne.
// Leo Tolstoy, John Milton <> Leo Tolstoy, John Milton, Nathaniel Hawthorne
//
// TestClass.Method4 was authored by John Milton, Leo Tolstoy.
// TestClass.Method1 was also authored by the same team.
// Leo Tolstoy, John Milton <> John Milton, Leo Tolstoy
open System
// A custom attribute to allow multiple authors per method.
[<AttributeUsage(AttributeTargets.Method); AllowNullLiteral>]
type AuthorsAttribute([<ParamArray>] names: string []) =
inherit Attribute()
member val Authors = ResizeArray names
// Determine if the object is a match to this one.
override this.Match(obj) =
match obj with
| :? AuthorsAttribute as authors2 ->
// Return true if obj and this instance are the same object reference.
if Object.ReferenceEquals(this, authors2) then true
// Return false if obj and this instance have different numbers of authors
elif this.Authors.Count <> authors2.Authors.Count then false
else
let authors1 = this.Authors |> set
let authors2 = this.Authors |> set
authors1 = authors2
| _ ->
// Return false if obj is null or not an AuthorsAttribute.
false
override this.ToString() =
let retval = String.Join(", ", this.Authors)
if retval.Trim().Length = 0 then
"<unknown>"
else
retval
// Add some authors to methods of a class.
type TestClass() =
[<Authors("Leo Tolstoy", "John Milton")>]
member _.Method1() = ()
[<Authors "Anonymous">]
member _.Method2() = ()
[<Authors("Leo Tolstoy", "John Milton", "Nathaniel Hawthorne")>]
member _.Method3() = ()
[<Authors("John Milton", "Leo Tolstoy")>]
member _.Method4() = ()
// Get the type for TestClass to access its metadata.
let clsType = typeof<TestClass>
// Iterate through each method of the class.
let mutable authors = null
for method in clsType.GetMethods() do
// Check each method for the Authors attribute.
let authAttr =
Attribute.GetCustomAttribute(method, typeof<AuthorsAttribute>)
:?> AuthorsAttribute
if authAttr <> null then
// Display the authors.
printfn $"{clsType.Name}.{method.Name} was authored by {authAttr}."
// Select Method1's authors as the basis for comparison.
if method.Name = "Method1" then
authors <- authAttr
printfn ""
else
// Compare first authors with the authors of this method.
if authors.Match authAttr then
printfn "TestClass.Method1 was also authored by the same team."
// Perform an equality comparison of the two attributes.
printfn $"""{authors} {if authors.Equals(authAttr) then "=" else "<>"} {authAttr}"""
printfn ""
// The example displays the following output:
// TestClass.Method1 was authored by Leo Tolstoy, John Milton.
//
// TestClass.Method2 was authored by Anonymous.
// Leo Tolstoy, John Milton <> Anonymous
//
// TestClass.Method3 was authored by Leo Tolstoy, John Milton, Nathaniel Hawthorne.
// Leo Tolstoy, John Milton <> Leo Tolstoy, John Milton, Nathaniel Hawthorne
//
// TestClass.Method4 was authored by John Milton, Leo Tolstoy.
// TestClass.Method1 was also authored by the same team.
// Leo Tolstoy, John Milton <> John Milton, Leo Tolstoy
Imports System.Collections.Generic
Imports System.Reflection
' A custom attribute to allow multiple authors per method.
<AttributeUsage(AttributeTargets.Method)> _
Public Class AuthorsAttribute : Inherits Attribute
Protected _authors As List(Of String)
Public Sub New(paramarray names As String())
_authors = New List(Of string)(names)
End Sub
Public ReadOnly Property Authors As List(Of String)
Get
Return _authors
End Get
End Property
' Determine if the object is a match to this one.
Public Overrides Function Match(obj As Object) As Boolean
' Return false if obj is null or not an AuthorsAttribute.
Dim authors2 As AuthorsAttribute = DirectCast(obj, AuthorsAttribute)
If authors2 Is Nothing Then Return False
' Return true if obj and this instance are the same object reference.
If Object.ReferenceEquals(Me, authors2) Then Return True
' Return false if obj and this instance have different numbers of authors
If _authors.Count <> authors2._authors.Count Then Return False
Dim matches As Boolean = False
For Each author in _authors
For ctr As Integer = 0 To authors2._authors.Count - 1
If author = authors2._authors(ctr) Then
matches = True
Exit For
End If
If ctr = authors2._authors.Count Then matches = False
Next
Next
Return matches
End Function
Public Overrides Function ToString() As String
Dim retval As String = ""
For ctr As Integer = 0 To _authors.Count -1
retval += $"{_authors(ctr)}{If(ctr < _authors.Count - 1, ", ", String.Empty)}"
Next
If retval.Trim().Length = 0 Then Return "<unknown>"
Return retval
End Function
End Class
' Add some authors to methods of a class.
Public Class TestClass
<Authors("Leo Tolstoy", "John Milton")>
Public sub Method1()
End sub
<Authors("Anonymous")>
Public Sub Method2()
End Sub
<Authors("Leo Tolstoy", "John Milton", "Nathaniel Hawthorne")>
Public Sub Method3()
End Sub
<Authors("John Milton", "Leo Tolstoy")>
Public Sub Method4()
End Sub
End Class
Public Module Example
Public Sub Main()
' Get the type for TestClass to access its metadata.
Dim clsType As Type = GetType(TestClass)
' Iterate through each method of the class.
Dim authors As AuthorsAttribute = Nothing
For Each method In clsType.GetMethods()
' Check each method for the Authors attribute.
Dim authAttr As AuthorsAttribute = DirectCast(Attribute.GetCustomAttribute(method,
GetType(AuthorsAttribute)), AuthorsAttribute)
If authAttr IsNot Nothing Then
' Display the authors.
Console.WriteLine($"{clsType.Name}.{method.Name} was authored by {authAttr}.")
' Select Method1's authors as the basis for comparison.
If method.Name = "Method1" Then
authors = authAttr
Console.WriteLine()
Continue For
End If
' Compare first authors with the authors of this method.
If authors.Match(authAttr) Then
Console.WriteLine("TestClass.Method1 was also authored by the same team.")
End If
' Perform an equality comparison of the two attributes.
Console.WriteLine($"{authors} {If(authors.Equals(authAttr), "=", "<>")} {authAttr}")
Console.WriteLine()
End If
Next
End Sub
End Module
' The example displays the following output:
// TestClass.Method1 was authored by Leo Tolstoy, John Milton.
//
// TestClass.Method2 was authored by Anonymous.
// Leo Tolstoy, John Milton <> Anonymous
//
// TestClass.Method3 was authored by Leo Tolstoy, John Milton, Nathaniel Hawthorne.
// Leo Tolstoy, John Milton <> Leo Tolstoy, John Milton, Nathaniel Hawthorne
//
// TestClass.Method4 was authored by John Milton, Leo Tolstoy.
// TestClass.Method1 was also authored by the same team.
// Leo Tolstoy, John Milton <> John Milton, Leo Tolstoy