Attribute.Match(Object) Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Quando è sottoposto a override in una classe derivata, restituisce un valore che indica se questa istanza equivale a un oggetto specificato.
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
Parametri
Restituisce
true
se questa istanza equivale a obj
; in caso contrario, false
.
Commenti
Questo metodo determina se uno Attribute è uguale a un altro. L'implementazione predefinita è uguale Equalsa , che determina se due attributi sono dello stesso tipo e hanno gli stessi valori di campo.
In generale, il metodo è destinato a eseguire un test standard per l'uguaglianza Equals di riferimento o valore. È possibile eseguire l'override del Match metodo quando si vuole eseguire un confronto personalizzato per l'uguaglianza basata su alcuni criteri diversi da quelli di due istanze di attributo sono dello stesso tipo e hanno valori identici. Ad esempio, è possibile eseguire l'override del Match metodo per confrontare gli attributi negli scenari seguenti:
Un attributo include un campo bit e si considerano due istanze di attributo uguali se è impostato un bit specifico. Ad esempio, un
NumericDisplay
attributo può includere un campo bit che indica i formati numerici (ad esempio binari, ottali, decimali ed esadecimali) supportati da un client. Il metodo sottoposto a override Match potrebbe considerare due istanze uguali se supportano lo stesso formato numerico.Un attributo include più campi che contengono lo stesso tipo di informazioni oppure contiene una matrice in cui i valori possono essere in qualsiasi ordine. Ad esempio, un
Author
attributo può includere più campi per i nomi di autore. Il metodo sottoposto a override Match può considerare due istanze uguali se hanno gli stessi autori indipendentemente dal fatto che ogni campo sia uguale al campo corrispondente.
Esempio
Nell'esempio seguente viene illustrato l'uso di per creare un metodo di confronto personalizzato per i valori degli Match attributi. Se definisce un oggetto AuthorsAttribute
che contiene internamente un List<String>
oggetto che archivia i nomi degli autori. Poiché i nomi possono verificarsi in qualsiasi ordine nell'elenco, esegue l'override del Match metodo per confrontare i nomi degli autori indipendentemente dalla posizione nell'elenco. Si noti il metodo, che esegue un test per l'uguaglianza Equals dei valori, restituisce risultati diversi dal Match metodo.
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