PC Review


Reply
Thread Tools Rate Thread

Assign Type at Runtime

 
 
blisspikle
Guest
Posts: n/a
 
      31st Jan 2007
I tried closely copying some code that I found on this group for
assigning a type at runtime, but I cannot get it to work. Can someone
see what is wrong with my logic?

Thanks,

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles Button1.Click
Dim s As String
s = "blah"
Dim t As Type
t = s.GetType
Dim obj As Object
obj = System.Activator.CreateInstance(t) 'Missing Exception
Unhandled - No parameterless constructor defined for this object.
obj = "hello"
s = DirectCast(obj, String)
RichTextBox1.Text = s
End Sub

 
Reply With Quote
 
 
 
 
Branco Medeiros
Guest
Posts: n/a
 
      31st Jan 2007
blisspikle wrote:
> I tried closely copying some code that I found on this group for
> assigning a type at runtime, but I cannot get it to work. Can someone
> see what is wrong with my logic?

<snip>
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e
> As System.EventArgs) Handles Button1.Click
> Dim s As String
> s = "blah"
> Dim t As Type
> t = s.GetType
> Dim obj As Object
> obj = System.Activator.CreateInstance(t) 'Missing Exception
> Unhandled - No parameterless constructor defined for this object.
> obj = "hello"
> s = DirectCast(obj, String)
> RichTextBox1.Text = s
> End Sub


You're getting the exception because, really, there's no parameterless
constructor in String (try for yourself, type "Dim S As New
String(" ... and you'll see).

Also, when you assign "hello" to obj, a new string object is created
and it's *that* object that is assigned to s, in the end. I guess what
you want is:

<aircode>
Dim S As String = "Blah"
Dim T As Type = S.GetType
Dim O As Object = _
System.Activator.CreateInstance(T, "hello".ToCharArray)
S = DirectCast(O, String)
</aircode>

But I still don't get the point, unless you want to instanciate
something other than a string...

HTH.

Regards,

Branco.

 
Reply With Quote
 
wfairl@gmail.com
Guest
Posts: n/a
 
      31st Jan 2007
On Jan 31, 10:16 am, "blisspikle" <eklas...@metforming.com> wrote:
> I tried closely copying some code that I found on this group for
> assigning a type at runtime, but I cannot get it to work. Can someone
> see what is wrong with my logic?
>
> Thanks,
>
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e
> As System.EventArgs) Handles Button1.Click
> Dim s As String
> s = "blah"
> Dim t As Type
> t = s.GetType
> Dim obj As Object
> obj = System.Activator.CreateInstance(t) 'Missing Exception
> Unhandled - No parameterless constructor defined for this object.
> obj = "hello"
> s = DirectCast(obj, String)
> RichTextBox1.Text = s
> End Sub


The problem is exactly as the message indicates, the string type has
no public parameterless constructor. You need to use one of the
possible constructors, for example the one taking a character array:

obj = System.Activator.CreateInstance(t, New Object()
{"hello".ToCharArray()})

 
Reply With Quote
 
Tom Shelton
Guest
Posts: n/a
 
      31st Jan 2007
On Jan 31, 11:16 am, "blisspikle" <eklas...@metforming.com> wrote:
> I tried closely copying some code that I found on this group for
> assigning a type at runtime, but I cannot get it to work. Can someone
> see what is wrong with my logic?
>
> Thanks,
>
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e
> As System.EventArgs) Handles Button1.Click
> Dim s As String
> s = "blah"
> Dim t As Type
> t = s.GetType
> Dim obj As Object
> obj = System.Activator.CreateInstance(t) 'Missing Exception
> Unhandled - No parameterless constructor defined for this object.


Because System.String has no parameterless constructor... In other
words, you can't call new String() on a string. You need to pass in
something like this:
obj = System.Activateor.CreateInstance (t, New Object[] {"Hello"})


> s = DirectCast(obj, String)
> RichTextBox1.Text = s
> End Sub


HTH,

--
Tom Shelton

 
Reply With Quote
 
blisspikle
Guest
Posts: n/a
 
      1st Feb 2007
I get messed up between instanciating an object and dimensioning the
object. Can someone point me to a place that lets me know a little
behind the scenes on what the difference is?

Is the New constructor called by default for a string when you use
s="blah". Is this because it has a default constructor? This cannot
be done with all Types right? I am going to list what I thought was
going on in my code below, it would probably be way too long to answer
these questions here?

Thanks for earlier answers, they were all really good. I could
probably try and plug my way through VB and have no idea what I am
doing, maybe that is why VB is popular?

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles Button1.Click
Dim s As String 'Not sure exactly what this
does behind the scenes, just know that you have to do it?
s = "blah" 'Somehow stores
(character array) into a String Type
Dim t As Type 'Not sure what it does
behind the scenes, but makes a variable that can hold a type?
t = s.GetType 'Get what type a string is,
which not sure what that would look like?
Dim obj As Object 'Dimension a non-specific
object that can store just about anything, not sure how it does it?
obj = System.Activator.CreateInstance(t) 'Create
instance of the type stored in t, and set to be obj, is there another
way to just

'dimension with the same type here rather then have to instantiate it?
obj = "hello" 'If obj is now a string
type I should be able to assign a value to it
s = DirectCast(obj, String) 'VB somehow switches types
RichTextBox1.Text = s 'assigns a string to a
richtextbox
End Sub


 
Reply With Quote
 
Tom Shelton
Guest
Posts: n/a
 
      1st Feb 2007
On Feb 1, 6:13 am, "blisspikle" <eklas...@metforming.com> wrote:
> I get messed up between instanciating an object and dimensioning the
> object. Can someone point me to a place that lets me know a little
> behind the scenes on what the difference is?
>
> Is the New constructor called by default for a string when you use
> s="blah". Is this because it has a default constructor? This cannot
> be done with all Types right? I am going to list what I thought was
> going on in my code below, it would probably be way too long to answer
> these questions here?
>
> Thanks for earlier answers, they were all really good. I could
> probably try and plug my way through VB and have no idea what I am
> doing, maybe that is why VB is popular?
>
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e
> As System.EventArgs) Handles Button1.Click
> Dim s As String 'Not sure exactly what this
> does behind the scenes, just know that you have to do it?


It allocates a reference to a string and clears it to Nothing. What
does that mean? Well, a string is a reference type, so it lives on
the heap (the dynamic data store). So, what you are really setting
aside is a variable that can point to a location on the heap that
holds a string. When the string is assigned and the memory is
allocated, then the reference will then contain the address of the
string...

> s = "blah" 'Somehow stores
> (character array) into a String Type


While string is a reference type, it is treated in some ways like a
value type by the compiler. This is one of those ways. Your
assignment above, is really equivalent to:

s = New String ("blah".ToCharArray())

But, because that would be a pain to type all the time the compiler
gives a break on it's syntax.

> Dim t As Type 'Not sure what it does
> behind the scenes, but makes a variable that can hold a type?


Yep. You go it that's what it does.

> t = s.GetType 'Get what type a string is,
> which not sure what that would look like?


Look at the docs for System.Type. It is an object that can be used to
discover a lot of information about the type of an object.

> Dim obj As Object 'Dimension a non-specific
> object that can store just about anything, not sure how it does it?


It does it by the power of polymorphism. In .Net everything derives
from System.Object. When you don't explicitly inherit from another
object, then you are inheriting from System.Object. Because of that,
you can store any .net object in a variable of type object. Of
course, you functionality is limited to that defined by the
System.Object interface

> obj = System.Activator.CreateInstance(t) 'Create
> instance of the type stored in t, and set to be obj, is there another
> way to just
>
> 'dimension with the same type here rather then have to instantiate it?


I'm not sure what you mean? With the string you could have just done:

Dim s2 As String = s

Now, with other reference types you might be suprised to learn that a
change to s would effect s2. But, that isn't the case with string.
It's another one of those places where the runtime treats string a
little more like a value type. Anyway, if you look in the docs about
string interning, then you will get an idea of what I'm talking about.

> obj = "hello" 'If obj is now a string
> type I should be able to assign a value to it


It's not a string type - obj is type object. You can assign anything
you want to it because everything in .net ultimately derives from
object.

> s = DirectCast(obj, String) 'VB somehow switches types


DirectCast will essentially make sure that the object your casting is
really of the type you are wanting to convert it too and if it is make
the assignment. If it isn't you get an exception.

> RichTextBox1.Text = s 'assigns a string to a
> richtextbox
> End Sub


I hope this helps somewhat. There is a lot more that could be said
about this, but I didn't want to go to deep. If you have any
questions, feel free to ask again

--
Tom Shelton

 
Reply With Quote
 
blisspikle
Guest
Posts: n/a
 
      5th Feb 2007
Thank you all for the answers.

Tom, you gave me a better understanding in one answer then I have been
able to get through reading the books. I'm sure that I will have more
questions

 
Reply With Quote
 
aaron.kempf@gmail.com
Guest
Posts: n/a
 
      7th Feb 2007
use VBS or VBA or VB6.

..NET doesn't support variants

-Aaron

 
Reply With Quote
 
Tom Shelton
Guest
Posts: n/a
 
      7th Feb 2007
On 2007-02-07, (E-Mail Removed) <(E-Mail Removed)> wrote:
> use VBS or VBA or VB6.
>
> .NET doesn't support variants


Good thing to. Variant was evil

--
Tom Shelton
 
Reply With Quote
 
RobinS
Guest
Posts: n/a
 
      7th Feb 2007

"Tom Shelton" <(E-Mail Removed)> wrote in message
news:qLmdnQL-V7-(E-Mail Removed)...
> On 2007-02-07, (E-Mail Removed) <(E-Mail Removed)> wrote:
>> use VBS or VBA or VB6.
>>
>> .NET doesn't support variants

>
> Good thing to. Variant was evil
>
> --
> Tom Shelton


Variants had their time and their place. I used them when reading data from
a database, because in VB, there was no way to set an integer to Null or
Nothing, and when dealing with data, there's a big difference between Null
and 0.

Now I use Nullable Types, and am much happier because they are so specific.
:-D

Robin S.
Ts'i mahnu uterna ot twan ot geifur hingts uto.


 
Reply With Quote
 
 
 
Reply

Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Assign datasource id at runtime ajaykalathil@gmail.com Microsoft ASP .NET 2 11th Jan 2008 11:16 AM
How to assign image on a button at runtime Kalim Julia Microsoft VB .NET 2 23rd Dec 2005 11:54 AM
Assign attributes to a property at runtime ? Herve Bocuse Microsoft Dot NET Framework 1 21st Feb 2005 07:04 PM
Assign ImageList to Toolbar at Runtime Bruce Vander Werf Microsoft Dot NET Compact Framework 3 7th Oct 2003 12:15 AM
Variable type Object, assign to a Class at runtime Andres Microsoft VB .NET 4 10th Sep 2003 09:09 PM


Features
 

Advertising
 

Newsgroups
 


All times are GMT +1. The time now is 06:55 PM.