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.