Attribute.Match メソッド
派生クラスによってオーバーライドされた場合、指定したオブジェクトとこのインスタンスが等しいかどうかを示す値を返します。
Public Overridable Function Match( _
ByVal obj As Object _) As Boolean
[C#]
public virtual bool Match(objectobj);
[C++]
public: virtual bool Match(Object* obj);
[JScript]
public function Match(
obj : Object) : Boolean;
パラメータ
- obj
Attribute のインスタンスと比較する Object 。
戻り値
このインスタンスと obj が等しい場合は true 。それ以外の場合は false 。
解説
このメソッドは、Attribute の 1 つがもう 1 つのものと等しいかどうかを判断します。既定の実装は Equals の場合と同じであり、値および参照比較を実行します。フラグやビットフィールドなど、単独で意味を持つコンポーネントから構成される属性値を使用できるように実装する場合には、このメソッドをオーバーライドしてください。たとえば、ある属性の値が、フラグのビットフィールドに分割されたバイナリ フィールドであるとします。この属性の 2 つのインスタンスにおいて、共通フラグが 1 つあり、その他のフラグはすべて異なるとします。 Equal メソッドでは、この 2 つのインスタンスに同一のフラグ設定があることを判断できませんが、Match メソッドでは判断できます。
使用例
Attribute のコンテキストでの Match の使用方法については、次のコード例を参照してください。
Imports System
Imports System.Reflection
Module DemoModule
' A custom attribute to allow 2 authors per method.
<AttributeUsage(AttributeTargets.Method)> _
Public Class AuthorsAttribute
Inherits Attribute
Public Sub New(ByVal name1 As String, ByVal name2 As String)
myAuthorName1 = name1
myAuthorName2 = name2
End Sub
Protected myAuthorName1 As String
Protected myAuthorName2 As String
Public Property AuthorName1() As String
Get
Return myAuthorName1
End Get
Set(ByVal Value As String)
myAuthorName1 = AuthorName1
End Set
End Property
Public Property AuthorName2() As String
Get
Return myAuthorName2
End Get
Set(ByVal Value As String)
myAuthorName2 = AuthorName2
End Set
End Property
' Use the hash code of the string objects and xor them together.
Public Overrides Function GetHashCode() As Integer
Return myAuthorName1.GetHashCode() Xor myAuthorName2.GetHashCode()
End Function
' Determine if the object is a match to this one.
Public Overrides Function Match(ByVal obj As Object) As Boolean
' Obviously a match.
If obj Is Me Then
Return True
End If
' Obviously we're not nothing, so no.
If obj Is Nothing Then
Return False
End If
If TypeOf obj Is AuthorsAttribute Then
' Combine the hash codes and see if they're unchanged.
Dim authObj As AuthorsAttribute = CType(obj, AuthorsAttribute)
Dim firstHash As Integer = authObj.GetHashCode() And GetHashCode()
If firstHash = GetHashCode() Then
Return True
Else
Return False
End If
Else
Return False
End If
End Function
End Class
' Add some authors to methods of a class.
Public Class TestClass1
<Authors("William Shakespeare", "Herman Melville")> _
Public Sub Method1()
End Sub
<Authors("Leo Tolstoy", "John Milton")> _
Public Sub Method2()
End Sub
End Class
' Add authors to a second class's methods.
Public Class TestClass2
<Authors("William Shakespeare", "Herman Melville")> _
Public Sub Method1()
End Sub
<Authors("Leo Tolstoy", "John Milton")> _
Public Sub Method2()
End Sub
<Authors("Francis Bacon", "Miguel Cervantes")> _
Public Sub Method3()
End Sub
End Class
Sub Main()
' Get the type for both classes to access their metadata.
Dim clsType1 As Type = GetType(TestClass1)
Dim clsType2 As Type = GetType(TestClass2)
Dim mInfo1 As MethodInfo
' Iterate through each method of the first class.
For Each mInfo1 In clsType1.GetMethods()
' Check each method for the Authors attribute.
Dim attr1 As Attribute = Attribute.GetCustomAttribute(mInfo1, _
GetType(AuthorsAttribute))
If Not attr1 Is Nothing And TypeOf attr1 Is AuthorsAttribute Then
Dim authAttr1 As AuthorsAttribute = _
CType(attr1, AuthorsAttribute)
' Display the authors.
Console.WriteLine("Method {0} was authored by {1} and {2}.", _
mInfo1.Name, authAttr1.AuthorName1, _
authAttr1.AuthorName2)
Dim mInfo2 As MethodInfo
' Iterate through each method of the second class.
For Each mInfo2 In clsType2.GetMethods()
' Check each method for the Authors attribute.
Dim attr2 As Attribute = Attribute.GetCustomAttribute( _
mInfo2, GetType(AuthorsAttribute))
If Not attr2 Is Nothing And _
TypeOf attr2 Is AuthorsAttribute Then
Dim authAttr2 As AuthorsAttribute = _
CType(attr2, AuthorsAttribute)
' Compare with the authors in the first class.
If authAttr2.Match(authAttr1) = True Then
Console.WriteLine("Method {0} in class {1} was " + _
"also authored by the same team.", _
mInfo2.Name, clsType2.Name)
End If
End If
Next
Console.WriteLine("")
End If
Next
End Sub
End Module
' Output:
' Method Method1 was authored by William Shakespeare and Herman Melville.
' Method Method1 in class TestClass2 was also authored by the same team.
'
' Method Method2 was authored by Leo Tolstoy and John Milton.
' Method Method2 in class TestClass2 was also authored by the same team.
[C#]
using System;
using System.Reflection;
namespace MatchCS {
// 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 DemoClass {
static void Main(string[] args) {
// 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.
Console.WriteLine("Method {0} was authored by {1} " +
"and {2}.", mInfo1.Name,
authAttr1.AuthorName1,
authAttr1.AuthorName2);
// 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))
Console.WriteLine("Method {0} in class {1} " +
"was authored by the same team.",
mInfo2.Name, clsType2.Name);
}
Console.WriteLine("");
}
}
}
}
}
/*
* 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.
*/
[C++]
#using <mscorlib.dll>
using namespace System;
using namespace System::Reflection;
// A custom attribute to allow 2 authors per method.
public __gc class AuthorsAttribute : public Attribute {
public:
AuthorsAttribute(String* name1, String* name2) {
authorName1 = name1;
authorName2 = name2;
}
protected:
String* authorName1;
String* authorName2;
public:
__property String* get_AuthorName1() { return authorName1; }
__property void set_AuthorName1( String* value ) { authorName1 = value; }
__property String* get_AuthorName2() { return authorName2; }
__property void set_AuthorName2( String* value ) { authorName2 = value; }
// Use the hash code of the string objects and xor them together.
int GetHashCode() {
return authorName1->GetHashCode() ^ authorName2->GetHashCode();
}
// Determine if the object is a match to this one.
bool Match(Object* obj) {
// Obviously a match.
if (obj == this)
return true;
// Obviously we're not null, so no.
if (obj == 0)
return false;
if (dynamic_cast<AuthorsAttribute*>(obj))
// Combine the hash codes and see if they're unchanged.
return ((dynamic_cast<AuthorsAttribute*>(obj))->GetHashCode() & GetHashCode())
== GetHashCode();
else
return false;
}
};
// Add some authors to methods of a class.
public __gc class TestClass1 {
public:
[Authors(S"William Shakespeare", S"Herman Melville")]
void Method1()
{}
[Authors(S"Leo Tolstoy", S"John Milton")]
void Method2()
{}
};
// Add authors to a second class's methods.
public __gc class TestClass2 {
public:
[Authors(S"William Shakespeare", S"Herman Melville")]
void Method1()
{}
[Authors(S"Leo Tolstoy", S"John Milton")]
void Method2()
{}
[Authors(S"William Shakespeare", S"John Milton")]
void Method3()
{}
};
int main() {
// 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.
System::Collections::IEnumerator* myEnum = clsType1->GetMethods()->GetEnumerator();
while (myEnum->MoveNext())
{
MethodInfo* mInfo1 = __try_cast<MethodInfo*>(myEnum->Current);
// Check each method for the Authors attribute.
AuthorsAttribute* authAttr1 = dynamic_cast<AuthorsAttribute*>
(Attribute::GetCustomAttribute(mInfo1, __typeof(AuthorsAttribute)));
if (authAttr1 != 0) {
// Display the authors.
Console::WriteLine(S"Method {0} was authored by {1} and {2}.",
mInfo1->Name,
authAttr1->AuthorName1,
authAttr1->AuthorName2);
// Iterate through each method of the second class.
System::Collections::IEnumerator* myEnum1 = clsType2->GetMethods()->GetEnumerator();
while (myEnum1->MoveNext())
{
MethodInfo* mInfo2 = __try_cast<MethodInfo*>(myEnum1->Current);
// Check each method for the Authors attribute.
AuthorsAttribute* authAttr2 = dynamic_cast<AuthorsAttribute*>(
Attribute::GetCustomAttribute(mInfo2, __typeof(AuthorsAttribute)));
// Compare with the authors in the first class.
if (authAttr2 != 0 && authAttr2->Match(authAttr1))
Console::WriteLine(S"Method {0} in class {1} was authored by the same team.",
mInfo2->Name, clsType2->Name);
}
Console::WriteLine();
}
}
}
/*
* 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.
*/
[JScript]
import System;
import System.Reflection;
package MatchJS {
// A custom attribute to allow 2 authors per method.
AttributeUsage(AttributeTargets.Method) public class AuthorsAttribute extends Attribute {
public function AuthorsAttribute(name1 : String, name2 : String) {
authorName1 = name1;
authorName2 = name2;
}
protected var authorName1 : String;
protected var authorName2 : String ;
public function get AuthorName1() : String {
return authorName1;
}
public function set AuthorName1( value: String ) {
authorName1 = value;
}
public function get AuthorName2() : String {
return authorName2;
}
public function set AuthorName2(value : String){
authorName2 = AuthorName2;
}
// Use the hash code of the string objects and xor them together.
public override function GetHashCode() : int {
return authorName1.GetHashCode() ^ authorName2.GetHashCode();
}
// Determine if the object is a match to this one.
public override function Match(obj) : boolean {
// Obviously a match.
if (obj == this)
return true;
// Obviously we're not null, so no.
if (obj == null)
return false;
if (obj instanceof 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 function Method1() : void
{}
Authors("Leo Tolstoy", "John Milton")
public function Method2() : void
{}
}
// Add authors to a second class's methods.
public class TestClass2 {
Authors("William Shakespeare", "Herman Melville")
public function Method1() : void
{}
Authors("Leo Tolstoy", "John Milton")
public function Method2() : void
{}
Authors("William Shakespeare", "John Milton")
public function Method3() : void
{}
}
class DemoClass {
static function Main() : void {
// Get the type for both classes to access their metadata.
var clsType1 : Type = TestClass1;
var clsType2 : Type = TestClass2;
// Iterate through each method of the first class.
var methods1 : MethodInfo[] = clsType1.GetMethods();
for(var i : int in methods1) {
var mInfo1 : MethodInfo = methods1[i];
// Check each method for the Authors attribute.
var authAttr1 : AuthorsAttribute = AuthorsAttribute(
Attribute.GetCustomAttribute(mInfo1, AuthorsAttribute));
if (authAttr1 != null) {
// Display the authors.
Console.WriteLine("Method {0} was authored by {1} " +
"and {2}.", mInfo1.Name,
authAttr1.AuthorName1,
authAttr1.AuthorName2);
// Iterate through each method of the second class.
var methods2 : MethodInfo[] = clsType2.GetMethods()
for( var j : int in methods2) {
var mInfo2 : MethodInfo = methods2[j];
// Check each method for the Authors attribute.
var authAttr2 : AuthorsAttribute = AuthorsAttribute(
Attribute.GetCustomAttribute(mInfo2,
AuthorsAttribute));
// Compare with the authors in the first class.
if (authAttr2 != null && authAttr2.Match(authAttr1))
Console.WriteLine("Method {0} in class {1} " +
"was authored by the same team.",
mInfo2.Name, clsType2.Name);
}
Console.WriteLine("");
}
}
}
}
}
MatchJS.DemoClass.Main();
/*
* 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 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET