CreateInstance and late binding

R

Rippo

Hi
I have the following console application and am attempting to late bind
a class with option strict on! However of course I cant and I get the
following error "Option Strict On disallows late binding" at the line
BL.a() in method Main

How do I overcome this?

Public Class test1

Public Sub a()
Console.WriteLine("TEST1.A Called")
End Sub

End Class

Public Class test2

Public Sub a()
Console.WriteLine("TEST2.A Called")
End Sub

End Class

Module Module1

Dim BL As Object

Sub New()
Dim o As Object
If 1 = 1 Then
o = Activator.CreateInstance(GetType(test1))
Dim BL As test1 = CType(o, test1)
Else
o = Activator.CreateInstance(GetType(test2))
Dim BL As test2 = CType(o, test2)
End If
End Sub

Sub Main()
BL.a()
Console.ReadLine()
End Sub

End Module
 
C

Cor Ligthert [MVP]

Rippo,

If you want to use late binding with option strict on, you have to do
yourself what VB does without that on.

The class for that is Reflection. There is enough written on MSDN in that
class and on the Interenet to see what it does. It is very popular to use.
I don't understand why because it has a huge bad impact on the performance
of your program.

http://msdn2.microsoft.com/en-us/library/system.reflection.aspx

I hope this helps,

Cor
 
J

Jim Wooley

An alternative to what Cor said, if your classes implement the same interface,
you can code to the interface rather than the instance. In that case, your
code becomes:

public interface IDoSomething
sub a()
end interface

public Class test1
implements IDoSomething
Public Sub a() implements IDoSomething.a
'...
end sub
end Class

Private BL as IDoSomething
Sub New()
Dim o As IDoSomething
If 1 = 1 Then
o = Activator.CreateInstance(GetType(test1))
Dim BL As test1 = CType(o, test1)
Else
o = Activator.CreateInstance(GetType(test2))
Dim BL As test2 = CType(o, test2)
End If
End Sub

Sub Main()
BL.a()
Console.ReadLine()
End Sub

Here, you have late binding with option strict.

Jim Wooley
http://devauthority.com/blogs/jwooley/default.aspx
 
R

Rippo

Nice one Jim

I have slightly modified your code!

Public Interface iSome
Sub a()
End Interface


Public Class test1 : Implements iSome

Public Sub a() Implements iSome.a
Console.WriteLine("TEST1.A Called")
End Sub

End Class

Public Class test2 : Implements iSome

Public Sub a() Implements iSome.a
Console.WriteLine("TEST2.A Called")
End Sub

End Class

Module Module1

Private BL As iSome

Sub New()
Dim o As Object
If 1 = 1 Then
o = Activator.CreateInstance(GetType(test1))
BL = CType(o, test1)
Else
o = Activator.CreateInstance(GetType(test2))
BL = CType(o, test2)
End If
End Sub

Sub Main()
BL.a()
Console.ReadLine()
End Sub

End Module
 
C

Cor Ligthert [MVP]

Jim,
if your classes implement the same interface, you can code to the
interface rather than the instance. In that case, your code becomes:
But than it is not late binding anymore it is accessing them using the
interface.

:)

Cor
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top