How do I create an instance from a string in C#?
Solution 1:
- You need to specify the full type name to
Type.GetType()
, including namespace, e.g. "Company.Project2.Type" - If the type isn't in the same assembly (or mscorlib), you need to give the assembly name too, including version information if it's strongly typed. For example, for a non-strongly typed assembly
Company.Project2.dll
, you might specify "Company.Project2.Type, Company.Project2". - To call a constructor with parameters you can call
Activator.CreateInstance(Type, Object[])
or get the exact constructor you want withType.GetConstructor()
and then callConstructorInfo.Invoke()
.
If that doesn't help, please give more information.
Solution 2:
If you want to create a type dynamically at run time, Activator.CreateInstance Method will do it for you. If you issue is with the type having a constructor with parameters, this overload will do this. For example, http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx
I advise looking through the overloads for the best match.
The namespace issue should be not be relavant - as long as the dll is in the bin directory or the GAC you should be OK. The rules may change if the assembly is Strongly named though.
Could you provide a code snippiet of the code that is not working (using the method you linked to)? This + the errors you are seeing will be very helpful! [update] Quick sample using the Activator.CreateInstance that handles Constructors w/ paramaters.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
BaseProduct b =(BaseProduct)System.Activator.CreateInstance(Type.GetType("ConsoleApplication1.Product")
,new object[]{typeof(string)},
new object[]{"123"}
);
//Activator..::.CreateInstance Method (Type, array<Object>[]()[], array<Object>[]()[])
}
}
public class Product: BaseProduct{
public Product(string id) {
}
public string Id {get;set;}
}
public abstract class BaseProduct {
abstract public string Id { get; set; }
}
}