Type.MakeXxxType() (or The Intricacies of Reflection) - a non-NETCF post
The other day someone dropped into my office and asked about the Type.MakeByRefType() method. Neither I nor my other visitor are experts in reflection on .Net, but we investigated and found the following:
Imagine this situation:
public class foo {
// Do something with an int.
public void bar(Int32 anArgument) { ... }
// Do something to an int and modify it.
public void bar(ref Int32 aRefArgument) { ... }
// Do something multiple times in one call.
public void bar(Int32[] anArrayArgument) { ... }
}
Now say you want to find bar() on type foo via reflection:
MethodInfo mi = typeof(foo).GetMethod("bar");
To specify the version of bar you want, you need GetMethod(string name, Type[] types). Okay, so getting the first version is straightforward:
MethodInfo mi = typeof(foo).GetMethod("bar", new Type[] { typeof(Int32) });
What if you want the second of third overload of bar()? Well, now you need Type.MakeByRefType() or Type.MakeArrayType() like this:
MethodInfo mi = typeof(foo).GetMethod("bar", new Type[] { typeof(Int32).MakeByRefType() });
or
MethodInfo mi = typeof(foo).GetMethod("bar", new Type[] ( typeof(Int32).MakeArrayType() });
Similarly, you can use Type.MakeGenericType() and/or Type.MakePointerType() for other method signatures.
Here's a simple sample:
using System;
using System.Reflection;
namespace SAMPLE
{
public class foo
{
public foo() {}
public void bar(int arg)
{
Console.WriteLine("bar(int arg): " + arg.ToString());
}
public void bar(ref int arg)
{
Console.WriteLine("bar(ref int arg): " + arg.ToString());
arg *= arg;
Console.WriteLine(" " + arg.ToString());
}
public void bar(int[] args)
{
Console.WriteLine("bar(int[] args): ");
for (int iArg = 0; iArg < args.Length; iArg++)
Console.WriteLine(" " + args[iArg].ToString());
}
}
public class MakeXxxType
{
static int arg = 1968;
static int refArg = 256;
static int[] argArray = new int[] { 1970, 1995, 2000 };
public static int Main()
{
foo f = new foo();
MethodInfo mi = f.GetType().GetMethod("bar", new Type[] { typeof(Int32) });
mi.Invoke(f, new object[] { arg });
mi = f.GetType().GetMethod("bar", new Type[] { typeof(Int32).MakeByRefType() });
mi.Invoke(f, new object[] { refArg });
mi = f.GetType().GetMethod("bar", new Type[] { typeof(Int32).MakeArrayType() });
mi.Invoke(f, new object[] { argArray });
return 0;
}
}
}
By the way, Type.MakeByRefType(), Type.MakeArrayType() and Type.MakePointerType() are not supported in the .net Compact Framework (yet?). However, Type.MakeGenericType() is supported.