Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reflection to invoke the constructor with ConstructorInfo

In a very Simple class like below,

class Program 
{

    public Program(int a, int b, int c)
    {
        Console.WriteLine(a);
        Console.WriteLine(b);
        Console.WriteLine(c);
    }
 }

and I use reflection to invoke the constructor

something like this...

   var constructorInfo = typeof(Program).GetConstructor(new[] { typeof(int), typeof(int),      typeof(int) });
        object[] lobject = new object[] { };
        int one = 1;
        int two = 2;
        int three = 3;
        lobject[0] = one;
        lobject[1] = two;
        lobject[2] = three;

        if (constructorInfo != null)
        {
            constructorInfo.Invoke(constructorInfo, lobject.ToArray);
        }

But I am getting an error saying "object does not match target type constructor info".

any help/comments greatly appreciated. thanks in advance.

like image 684
now he who must not be named. Avatar asked Nov 23 '12 05:11

now he who must not be named.


1 Answers

You don't need to pass constructorInfo as a parameter, as soon as you are calling a constructor, but not an instance method of an object.

var constructorInfo = typeof(Program).GetConstructor(
                          new[] { typeof(int), typeof(int), typeof(int) });
if (constructorInfo != null)
{
    object[] lobject = new object[] { 1, 2, 3 };
    constructorInfo.Invoke(lobject);
}

For KeyValuePair<T,U>:

public Program(KeyValuePair<int, string> p)
{
    Console.WriteLine(string.Format("{0}:\t{1}", p.Key, p.Value));
}

static void Main(string[] args)
{
    var constructorInfo = typeof(Program).GetConstructor(
                             new[] { typeof(KeyValuePair<int, string>) });
    if (constructorInfo != null)
    {
        constructorInfo.Invoke(
            new object[] { 
                new KeyValuePair<int, string>(1, "value for key 1") });
    }

    Console.ReadLine();
}
like image 184
horgh Avatar answered Sep 20 '22 17:09

horgh