Auf Englisch lesen

Freigeben über


Attribute.Match(Object) Methode

Definition

Beim Überschreiben in einer abgeleiteten Klasse wird ein Wert zurückgegeben, der angibt, ob diese Instanz einem bestimmten Objekt entspricht.

C#
public virtual bool Match(object? obj);
C#
public virtual bool Match(object obj);

Parameter

obj
Object

Ein Object, das mit dieser Instanz von Attribute verglichen werden soll.

Gibt zurück

true, wenn diese Instanz obj gleicht; andernfalls false.

Hinweise

Mit dieser Methode wird ermittelt, ob eine Attribute gleich der anderen ist. Die Standardimplementierung ist identisch mit Equals, wodurch bestimmt wird, ob zwei Attribute vom gleichen Typ sind und die gleichen Feldwerte aufweisen.

Im Allgemeinen ist die Methode für die Equals Durchführung eines Standardtests auf Verweis- oder Wertgleichheit vorgesehen. Sie können die Match -Methode überschreiben, wenn Sie einen benutzerdefinierten Vergleich für Gleichheit durchführen möchten, der auf einigen anderen Kriterien basiert, als dass zwei Attributinstanzen vom gleichen Typ sind und identische Werte aufweisen. Beispielsweise können Sie die Match -Methode überschreiben, um Attribute in den folgenden Szenarien zu vergleichen:

  • Ein Attribut enthält ein Bitfeld, und Sie betrachten zwei Attributinstanzen als gleich, wenn ein bestimmtes Bit festgelegt ist. Ein NumericDisplay Attribut kann beispielsweise ein Bitfeld enthalten, das angibt, welche numerischen Formate (z. B. binär, oktal, dezimal und hexadezimal) ein Client unterstützt. Die überschriebene Match Methode kann zwei Instanzen als gleich betrachten, wenn sie das gleiche numerische Format unterstützen.

  • Ein Attribut enthält mehrere Felder, die dieselbe Art von Informationen enthalten, oder es enthält ein Array, in dem Werte in beliebiger Reihenfolge sein können. Ein Author Attribut kann beispielsweise mehrere Felder für Autorennamen enthalten. Die überschriebene Match Methode kann zwei Instanzen als gleich betrachten, wenn sie dieselben Autoren haben, unabhängig davon, ob jedes Feld dem entsprechenden Feld entspricht.

Beispiel

Das folgende Beispiel veranschaulicht die Verwendung von Match zum Erstellen einer benutzerdefinierten Vergleichsmethode für Attributwerte. Wenn ein AuthorsAttribute definiert, das intern ein List<String> enthält, in dem Autorennamen gespeichert werden. Da die Namen in beliebiger Reihenfolge in der Liste auftreten können, wird die Match Methode zum Vergleichen von Autorennamen unabhängig von ihrer Position in der Liste außer Kraft gesetzt. Beachten Sie, dass die Equals Methode, die einen Test auf Wertgleichheit durchführt, andere Ergebnisse als die Match -Methode zurückgibt.

C#
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

Gilt für:

Produkt Versionen
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1