情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Attribute.Match メソッド

2013/12/12

派生クラス内でオーバーライドされたときに、指定したオブジェクトとこのインスタンスが等しいかどうかを示す値を返します。

Namespace:  System
アセンブリ:  mscorlib (mscorlib.dll 内)

public virtual bool Match(
	Object obj
)

パラメーター

obj
型: System.Object
Attribute のこのインスタンスと比較する Object

戻り値

型: System.Boolean
このインスタンスと obj が等しい場合は true。それ以外の場合は false

このメソッドは、Attribute が相互に等しいかどうかを判断します。既定の実装は Equals の場合と同じであり、値および参照比較を実行します。フラグやビット フィールドなど、単独で意味を持つコンポーネントで構成される属性値のサポートを実装するには、このメソッドをオーバーライドします。

たとえば、ある属性の値が、フラグのビット フィールドに分割されたバイナリ フィールドであるとします。この属性の 2 つのインスタンスにおいて、共通フラグが 1 つあり、その他のフラグはすべて異なるとします。Equals メソッドは、この 2 つのインスタンスに同じフラグが設定されているかどうかを判断できませんが、Match メソッドは判断できます。

Attribute のコンテキストでの Match の使用方法を次のコード例に示します。


using System;
using System.Reflection;

// A custom attribute to allow 2 authors per method.
public class AuthorsAttribute : Attribute
{
  public AuthorsAttribute(string name1, string name2)
  {
     authorName1 = name1;
     authorName2 = name2;
  }

  protected string authorName1;
  protected string authorName2;

  public string AuthorName1
  {
     get { return authorName1; }
     set { authorName1 = AuthorName1; }
  }

  public string AuthorName2
  {
     get { return authorName2; }
     set { authorName2 = AuthorName2; }
  }

  // Use the hash code of the string objects and xor them together.
  public override int GetHashCode()
  {
     return authorName1.GetHashCode() ^ authorName2.GetHashCode();
  }

  // Determine if the object is a match to this one.
  public override bool Match(object obj)
  {
     // Obviously a match.
     if (obj == this)
        return true;

     // Obviously we're not null, so no.
     if (obj == null)
        return false;

     if (obj is AuthorsAttribute)
        // Combine the hash codes and see if they're unchanged.
        return (((AuthorsAttribute)obj).GetHashCode() & GetHashCode())
           == GetHashCode();
     else
        return false;
  }
}

// Add some authors to methods of a class.
public class TestClass1
{
  [Authors("William Shakespeare", "Herman Melville")]
  public void Method1()
  { }

  [Authors("Leo Tolstoy", "John Milton")]
  public void Method2()
  { }
}

// Add authors to a second class's methods.
public class TestClass2
{
  [Authors("William Shakespeare", "Herman Melville")]
  public void Method1()
  { }

  [Authors("Leo Tolstoy", "John Milton")]
  public void Method2()
  { }

  [Authors("William Shakespeare", "John Milton")]
  public void Method3()
  { }
}

class Example
{
  public static void Demo(System.Windows.Controls.TextBlock outputBlock)
  {
     // Get the type for both classes to access their metadata.
     Type clsType1 = typeof(TestClass1);
     Type clsType2 = typeof(TestClass2);

     // Iterate through each method of the first class.
     foreach (MethodInfo mInfo1 in clsType1.GetMethods())
     {
        // Check each method for the Authors attribute.
        AuthorsAttribute authAttr1 = (AuthorsAttribute)
           Attribute.GetCustomAttribute(mInfo1,
           typeof(AuthorsAttribute));
        if (authAttr1 != null)
        {
           // Display the authors.
           outputBlock.Text += String.Format("Method {0} was authored by {1} " +
                          "and {2}.", mInfo1.Name,
                          authAttr1.AuthorName1,
                          authAttr1.AuthorName2) + "\n";
           // Iterate through each method of the second class.
           foreach (MethodInfo mInfo2 in clsType2.GetMethods())
           {
              // Check each method for the Authors attribute.
              AuthorsAttribute authAttr2 = (AuthorsAttribute)
                 Attribute.GetCustomAttribute(mInfo2,
                 typeof(AuthorsAttribute));
              // Compare with the authors in the first class.
              if (authAttr2 != null && authAttr2.Match(authAttr1))
                 outputBlock.Text += String.Format("Method {0} in class {1} " +
                    "was authored by the same team.",
                    mInfo2.Name, clsType2.Name) + "\n";
           }
           outputBlock.Text += "" + "\n";
        }
     }
  }
}

/*
 * Output:
 * Method Method1 was authored by William Shakespeare and Herman Melville.
 * Method Method1 in class TestClass2 was authored by the same team.
 *
 * Method Method2 was authored by Leo Tolstoy and John Milton.
 * Method Method2 in class TestClass2 was authored by the same team.
 */


Windows Phone OS

サポート: 8.0, 7.1, 7.0

表示: