Imports System
Imports System.Reflection
Imports System.IO
Class Invoke
Public Shared Sub Main()
' BindingFlags.InvokeMethod
' Call a static method.
Dim t As Type = GetType(TestClass)
Console.WriteLine()
Console.WriteLine("Invoking a static method.")
Console.WriteLine("-------------------------")
t.InvokeMember("SayHello", BindingFlags.InvokeMethod Or BindingFlags.Public Or BindingFlags.Static, Nothing, Nothing, New Object() {})
' BindingFlags.InvokeMethod
' Call an instance method.
Dim c As New TestClass()
Console.WriteLine()
Console.WriteLine("Invoking an instance method.")
Console.WriteLine("----------------------------")
c.GetType().InvokeMember("AddUp", BindingFlags.InvokeMethod, Nothing, c, New Object() {})
c.GetType().InvokeMember("AddUp", BindingFlags.InvokeMethod, Nothing, c, New Object() {})
' BindingFlags.InvokeMethod
' Call a method with parameters.
Dim args() As Object = {100.09, 184.45}
Dim result As Object
Console.WriteLine()
Console.WriteLine("Invoking a method with parameters.")
Console.WriteLine("---------------------------------")
result = t.InvokeMember("ComputeSum", BindingFlags.InvokeMethod, Nothing, Nothing, args)
Console.WriteLine("{0} + {1} = {2}", args(0), args(1), result)
' BindingFlags.GetField, SetField
Console.WriteLine()
Console.WriteLine("Invoking a field (getting and setting.)")
Console.WriteLine("--------------------------------------")
' Get a field value.
result = t.InvokeMember("Name", BindingFlags.GetField, Nothing, c, New Object() {})
Console.WriteLine("Name == {0}", result)
' Set a field.
t.InvokeMember("Name", BindingFlags.SetField, Nothing, c, New Object() {"NewName"})
result = t.InvokeMember("Name", BindingFlags.GetField, Nothing, c, New Object() {})
Console.WriteLine("Name == {0}", result)
Console.WriteLine()
Console.WriteLine("Invoking an indexed property (getting and setting.)")
Console.WriteLine("--------------------------------------------------")
' BindingFlags.GetProperty
' Get an indexed property value.
Dim index As Integer = 3
result = t.InvokeMember("Item", BindingFlags.GetProperty, Nothing, c, New Object() {index})
Console.WriteLine("Item[{0}] == {1}", index, result)
' BindingFlags.SetProperty
' Set an indexed property value.
index = 3
t.InvokeMember("Item", BindingFlags.SetProperty, Nothing, c, New Object() {index, "NewValue"})
result = t.InvokeMember("Item", BindingFlags.GetProperty, Nothing, c, New Object() {index})
Console.WriteLine("Item[{0}] == {1}", index, result)
Console.WriteLine()
Console.WriteLine("Getting a field or property.")
Console.WriteLine("----------------------------")
' BindingFlags.GetField
' Get a field or property.
result = t.InvokeMember("Name", BindingFlags.GetField Or BindingFlags.GetProperty, Nothing, c, New Object() {})
Console.WriteLine("Name == {0}", result)
' BindingFlags.GetProperty
result = t.InvokeMember("Value", BindingFlags.GetField Or BindingFlags.GetProperty, Nothing, c, New Object() {})
Console.WriteLine("Value == {0}", result)
Console.WriteLine()
Console.WriteLine("Invoking a method with named parameters.")
Console.WriteLine("---------------------------------------")
' BindingFlags.InvokeMethod
' Call a method using named parameters.
Dim argValues() As Object = {"Mouse", "Micky"}
Dim argNames() As [String] = {"lastName", "firstName"}
t.InvokeMember("PrintName", BindingFlags.InvokeMethod, Nothing, Nothing, argValues, Nothing, Nothing, argNames)
Console.WriteLine()
Console.WriteLine("Invoking a default member of a type.")
Console.WriteLine("------------------------------------")
' BindingFlags.Default
' Call the default member of a type.
Dim t3 As Type = GetType(TestClass2)
t3.InvokeMember("", BindingFlags.InvokeMethod Or BindingFlags.Default, Nothing, New TestClass2(), New Object() {})
Console.WriteLine()
Console.WriteLine("Invoking a method by reference.")
Console.WriteLine("-------------------------------")
' BindingFlags.Static, NonPublic, and Public
' Invoking a member by reference.
Dim m As MethodInfo = t.GetMethod("Swap")
args = New Object(1) {}
args(0) = 1
args(1) = 2
m.Invoke(New TestClass(), args)
Console.WriteLine("{0}, {1}", args(0), args(1))
' The string is case-sensitive.
Dim t4 As Type = System.Type.GetType("System.String")
' Check to see if the value is valid. If the object is null, the type does not exist.
If t4 Is Nothing Then
Console.WriteLine("Please ensure that you specify only valid types in the type field.")
Console.WriteLine("The type name is case-sensitive.")
Return
End If
' Declare and populate the arrays to hold the information.
' You must declare either NonPublic or Public with Static or the search will not work.
Dim fi As FieldInfo() = t4.GetFields((BindingFlags.Static Or BindingFlags.NonPublic Or BindingFlags.Public))
' BindingFlags.NonPublic
Dim miNonPublic As MethodInfo() = t4.GetMethods((BindingFlags.Static Or BindingFlags.NonPublic))
' BindingFlags.Public
Dim miPublic As MethodInfo() = t4.GetMethods((BindingFlags.Static Or BindingFlags.Public))
' Iterate through all the nonpublic methods.
Dim method As MethodInfo
For Each method In miNonPublic
Console.WriteLine(method)
Next method
' Iterate through all the public methods.
For Each method In miPublic
Console.WriteLine(method)
Next method
' Iterate through all the fields.
Dim f As FieldInfo
For Each f In fi
Console.WriteLine(f)
Next f
' Call an instance method.
Dim tc As New TestClass()
Console.WriteLine()
Console.WriteLine("Invoking an Instance method.")
Console.WriteLine("----------------------------")
tc.GetType().InvokeMember("AddUp", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.CreateInstance, Nothing, tc, New Object() {})
' BindingFlags.CreateInstance
' Calling and creating an instance method.
Console.WriteLine()
Console.WriteLine("Invoking and creating an instance method.")
Console.WriteLine("-----------------------------------------")
tc.GetType().InvokeMember("AddUp", BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.CreateInstance, Nothing, tc, New Object() {})
' BindingFlags.DeclaredOnly
Dim tc2 As New TestClass()
Console.WriteLine()
Console.WriteLine("DeclaredOnly members")
Console.WriteLine("---------------------------------")
Dim memInfo As System.Reflection.MemberInfo() = tc2.GetType().GetMembers(BindingFlags.DeclaredOnly)
Dim i As Integer
For i = 0 To memInfo.Length - 1
Console.WriteLine(memInfo(i).Name)
Next i
' BindingFlags.SuppressChangeType
Dim obj As New TestClass()
Console.WriteLine()
Console.WriteLine("Invoking static method - PrintName")
Console.WriteLine("---------------------------------")
Dim methInfo As System.Reflection.MethodInfo = obj.GetType().GetMethod("PrintName")
methInfo.Invoke(obj, BindingFlags.SuppressChangeType Or BindingFlags.InvokeMethod, Nothing, New Object() {"Brad", "Smith"}, Nothing)
' BindingFlags.IgnoreCase
Console.WriteLine()
Console.WriteLine("Using IgnoreCase and invoking the PrintName method.")
Console.WriteLine("---------------------------------------------------")
methInfo = obj.GetType().GetMethod("PrintName")
methInfo.Invoke(obj, BindingFlags.IgnoreCase Or BindingFlags.InvokeMethod, Nothing, New Object() {"brad", "smith"}, Nothing)
' BindingFlags.IgnoreReturn
Console.WriteLine()
Console.WriteLine("Using IgnoreReturn and invoking the PrintName method.")
Console.WriteLine("-----------------------------------------------------")
methInfo = obj.GetType().GetMethod("PrintName")
methInfo.Invoke(obj, BindingFlags.IgnoreReturn Or BindingFlags.InvokeMethod, Nothing, New Object() {"Brad", "Smith"}, Nothing)
' BindingFlags.OptionalParamBinding
Console.WriteLine()
Console.WriteLine("Using OptionalParamBinding and invoking the PrintName method.")
Console.WriteLine("-------------------------------------------------------------")
methInfo = obj.GetType().GetMethod("PrintName")
methInfo.Invoke(obj, BindingFlags.OptionalParamBinding Or BindingFlags.InvokeMethod, Nothing, New Object() {"Brad", "Smith"}, Nothing)
' BindingFlags.ExactBinding
Console.WriteLine()
Console.WriteLine("Using ExactBinding and invoking the PrintName method.")
Console.WriteLine("-----------------------------------------------------")
methInfo = obj.GetType().GetMethod("PrintName")
methInfo.Invoke(obj, BindingFlags.ExactBinding Or BindingFlags.InvokeMethod, Nothing, New Object() {"Brad", "Smith"}, Nothing)
' BindingFlags.FlattenHierarchy
Console.WriteLine()
Console.WriteLine("Using FlattenHierarchy and invoking the PrintName method.")
Console.WriteLine("---------------------------------------------------------")
methInfo = obj.GetType().GetMethod("PrintName")
methInfo.Invoke(obj, BindingFlags.FlattenHierarchy Or BindingFlags.InvokeMethod, Nothing, New Object() {"Brad", "Smith"}, Nothing)
End Sub
End Class
Public Class TestClass
Public Name As [String]
Private values() As [Object] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
Default Public Property Item(ByVal index As Integer) As [Object]
Get
Return values(index)
End Get
Set(ByVal Value As [Object])
values(index) = Value
End Set
End Property
Public ReadOnly Property Value() As [Object]
Get
Return "the value"
End Get
End Property
Public Sub New()
Name = "initialName"
End Sub 'New
Private methodCalled As Integer = 0
Public Shared Sub SayHello()
Console.WriteLine("Hello")
End Sub 'SayHello
Public Sub AddUp()
methodCalled += 1
Console.WriteLine("AddUp Called {0} times", methodCalled)
End Sub 'AddUp
Public Shared Function ComputeSum(ByVal d1 As Double, ByVal d2 As Double) As Double
Return d1 + d2
End Function 'ComputeSum
Public Shared Sub PrintName(ByVal firstName As [String], ByVal lastName As [String])
Console.WriteLine("{0},{1}", lastName, firstName)
End Sub 'PrintName
Public Sub PrintTime()
Console.WriteLine(DateTime.Now)
End Sub 'PrintTime
Public Sub Swap(ByRef a As Integer, ByRef b As Integer)
Dim x As Integer = a
a = b
b = x
End Sub
End Class
<DefaultMemberAttribute("PrintTime")> _
Public Class TestClass2
Public Sub PrintTime()
Console.WriteLine(DateTime.Now)
End Sub 'PrintTime
End Class
|