Attribute.Match(Object) Metoda

Definice

Při přepsání v odvozené třídě vrátí hodnotu, která označuje, zda se tato instance rovná zadanému objektu.

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

Parametry

obj
Object

An Object pro porovnání s touto instancí .Attribute

Návraty

truepokud se tato instance rovná obj; v opačném případě . false

Poznámky

Tato metoda určuje, jestli se jedna Attribute rovná druhé. Jeho výchozí implementace je stejná jako Equals, která určuje, zda jsou dva atributy stejného typu a mají stejné hodnoty polí.

Obecně platí, že Equals metoda je určena k provedení standardního testu rovnosti odkazu nebo hodnoty. Můžete přepsat metodu Match , pokud chcete provést vlastní porovnání rovnosti založené na některých kritériích kromě toho, že dvě instance atributu jsou stejného typu a mají stejné hodnoty. Například můžete přepsat metodu Match pro porovnání atributů v následujících scénářích:

  • Atribut obsahuje bitové pole a pokud je nastaven určitý bit, považujete dvě instance atributu za stejné. Atribut může například obsahovat bitové pole, NumericDisplay které označuje, jaké číselné formáty (například binární, osmičkové, desetinné a šestnáctkové) klient podporuje. Přepsaná Match metoda může považovat dvě instance za stejné, pokud podporují stejný číselný formát.

  • Atribut obsahuje více polí, která obsahují stejný druh informací, nebo obsahuje pole, ve kterém mohou být hodnoty v libovolném pořadí. Atribut může například Author obsahovat více polí pro jména autorů. Přepsaná Match metoda může považovat dvě instance za stejné, pokud mají stejné autory bez ohledu na to, zda se každé pole rovná odpovídajícímu poli.

Příklad

Následující příklad ukazuje použití Match metody k vytvoření vlastní metody porovnání hodnot atributů. If definuje objekt AuthorsAttribute , který interně obsahuje název List<String> , který ukládá jména autorů. Vzhledem k tomu, že jména mohou být v seznamu v libovolném pořadí, přepíše metodu Match porovnávání jmen autorů bez ohledu na jejich umístění v seznamu. Všimněte si Equals , že metoda, která provádí test rovnosti hodnot, vrací jiné výsledky než Match metoda.

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

Platí pro

Produkt Verze
.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