Attribute.Match(Object) 方法

定义

当在派生类中重写时,返回一个指示此实例是否等于指定对象的值。

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
Object

Object 的此实例进行比较的 Attribute

返回

如果该实例等于 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

适用于