65.9K
CodeProject is changing. Read more.
Home

out, ref and InvokeMember !!!

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (3 votes)

Jul 30, 2010

CPOL
viewsIcon

28492

How to pass out or ref parameters for the method invoked using Type.InvokeMember?

When I was working on the .NET reflection extravaganza thing that I explained in my previous column, I learnt one other interesting thing, that is about the Type.InvokeMember. How to pass out or ref parameters for the method invoked using Type.InvokeMember? If you are going to invoke a method with the prototype:

int DoSomething(string someString, int someInt);

then you would use InvokeMember like this:

object obj = someType.InvokeMember("DoSomething", 
        BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
        null,
        this,
        new object[] {"Largest Integer", 1});

or use some variables in the new object[] {...}. But what do you do with the args if DoSomething takes out or ref parameters?

int DoSomething(out string someString, ref int someInt);

Something like this will not work:

string someText = string.Empty;
int someInt = 0;
object obj = someType.InvokeMember("DoSomething", 
        BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
        null,
        this,
        new object[] {someText, someInt});

It is tricky.

object[] args = new object[] { someText, someInt };
object obj = someType.InvokeMember("DoSomething", 
        BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
        null,
        this,
        args);

or even surprisingly this works:

object[] args = new object[2];
// or object[] args = new object[] { null, null };

object obj = someType.InvokeMember("DoSomething", 
 BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
 null,
 this,
 args);

Access the values by indexing args. So declaring the argument object[] as a local variable solves the problem, but I do not understand why this behaviour. May be somebody can explain !!!