views:

231

answers:

4

I want to create an instance of value types like System.String, System.Boolean, System.Int32, etc. I get qualified names of types like System.String or MyNamespace.Employee and I have to create an instance and return back. I use Activator.CreateInstance and FormatterServices.GetUninitializedObject to create instances. But it fails in case of value types. I cannot hard code the logic in case of value types. I need a generic way of creating instances of both value types and reference types.

+1  A: 

What exactly is it you are trying to do? FormatterServices.GetUninitializedObject is used mainly by serialization code; outside of that you shouldn't really use it. It sounds like you might just need something like TypeConverter, i.e. (for these types)

TypeConverter tc = TypeDescriptor.GetConverter(someType);
object obj = tc.ConvertFromString(s);
Marc Gravell
Thanks it helped.
Hemanshu Bhojak
+1  A: 

What exactly is failing? I tried the following code to see if there is a problem with value types:

var instance = Activator.CreateInstance(typeof(Int32));

It gives me an Int32 instance set to 0.

Where exactly is your code failing? Otherwise I would say the problem lies with the way you are loading the type, not the way you are creating the instance.

Jaco Pretorius
Eish Jaco! I just went back to change my 'var' to an 'int', in case 'var' was unfamiliar to the OP, and you sneak in the exact same line of code as me. :-)
ProfK
Haha - you gotta be quick on the draw :-)
Jaco Pretorius
A: 

This works for me:

int x = (int)Activator.CreateInstance(typeof (Int32), true);
ProfK
A: 

For BCL Value Types (and when using Strings to describe types) ensure you are not using C# keywords and ensure the Type is fully qualified with namespace. For example, C# int is successfully created this way with Activator.CreateInstance(..)

    object num = Activator.CreateInstance(Type.GetType("System.Int32"));

You will get failed attempts if you try to use language-specific aliases like "int" or short forms like "Int32".

John K