Recently, in my components library project, I needed to create instances of types dynamically and execute their methods using dynamic types.
Activator class can be used for this purpose. The CreateInstance method of Activator class takes a type and creates a Type object. Once we have a Type object, we can use InvokeMember method to execute a member of a type.
In this following code snippet, I create a Type objet of StringBuilder and invoke Append and ToString methods of StringBuilder.
Imports System
Imports System.Text
Imports System.Reflection
Module Module1
Sub Main()
Dim dynamicType As Type = GetType(StringBuilder)
' Create an instance of a Type by calling Activator.CreateInstance
Dim dynamicObject As Object = Activator.CreateInstance(dynamicType)
' Invoke Append method to add string to StringBuilder
dynamicType.InvokeMember("Append", _
BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.InvokeMethod, _
Type.DefaultBinder, dynamicObject, New Object() {"First String | "})
dynamicType.InvokeMember("Append", _
BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.InvokeMethod, _
Type.DefaultBinder, dynamicObject, New Object() {" Second String Appended "})
dynamicType.InvokeMember("Append", _
BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.InvokeMethod, _
Type.DefaultBinder, dynamicObject, New Object() {" Third String Appended "})
' Invoke ToString method to get string out of StringBuilder
Console.Write(dynamicType.InvokeMember("ToString", _
BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.InvokeMethod, _
Type.DefaultBinder, dynamicObject, Nothing))
Console.ReadKey()
End Sub
End Module