A long title, but I wanted it to be specific. The title is really the question. Even though the method that InvokeMember is calling has an out parameter and is assigning a value to to that parameter I can’t grab that value. Here is the code I was initially using:
string parameter = "";
int result = Convert.ToInt32(typeof(Ability).InvokeMember(selectedMove, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, new object[] { parameter }));
I changed it this, which now makes it work as intended but I don’t know why:
object[] args = new object[1]; //necessary to retrieve ref/out parameter
int result = Convert.ToInt32(typeof(Ability).InvokeMember(selectedMove, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, args));
In your first code example, the call to
InvokeMemberdoesn’t modify the value of theparametervariable, it just replaces the first item in the parameter array (which now points to a differentstringinstance). Since you didn’t keep a reference to this array, you can’t retrieve the value of the output parameter.In other words: the array initially contains a copy of the
parametervariable (i.e. a copy of the reference to an empty string). After the call,parameterand the value in the array refer to 2 different string instances.