Click here to Skip to main content
Click here to Skip to main content
Technical Blog

Tagged as

out, ref and InvokeMember !!!

, 30 Jul 2010 CPOL
Rate this:
Please Sign up or sign in to vote.
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 !!!

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Vivek Ragunathan
Software Developer (Senior)
United States United States
No Biography provided

Comments and Discussions

 
AnswerWhy it works Pinmembernjshaw27-Nov-14 1:10 
QuestionThanks PinmemberBouncingSoul28-Jul-13 23:45 
QuestionTest This Pinmembermcpoo7261-Feb-13 13:47 
Did you test this. I did and it doesn't seem to work.
EWM
God Bless America

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.150301.1 | Last Updated 30 Jul 2010
Article Copyright 2010 by Vivek Ragunathan
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid