Click here to Skip to main content
15,031,345 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:

Does anyone know how Control.Invoke can invoke a method which has ref

For example,

class A {
public delegate MyFuncHandler(ref int i, ref int j);

public void MyFunc(ref int i, ref int j)

public A

public void MyCaller(DataGridView oDataGridView)
int x = 1;
int y = 1;


oDataGridView.Invoke(new MyHandler(MyFunc), new object { ref x, ref y });


oDataGridView.Invoke(new MyHandler(MyFunc), new object { ref x, ref y });

produces compilation error. Am I doing this wrong, or Control.Invoke does
not allow method with ref parameters?

Updated 27-Sep-13 22:51pm

1 solution

The overload of Control.Invoke has an overload with a params object array. The params parameter allows to pass a variable number of elements directly without the need to explicitly pack them into an array.
In params, you cannot pass references. But keep in mind that if you pass reference types, that they are by definition reference paramater. I.e. whatever you modify inside the invocation has an effect to the passed reference type parameters.

Assuming you have instances of reference types (not value types) that you pass to the invocation, your call looks like this:
oDataGridView.Invoke(new MyHandler(MyFunc), x, y);

or even
oDataGridView.Invoke(MyFunc, x, y);

On the other hand, if you need to pass multiple value types values as references, you can pack them into some kind of container and pass the container (which is a reference type) to the handler. If it's homogenous types (all the same type), use any of the collections from System.Collections.Generic namespace. If it is inhomogenous types (not all types are the same), use a Tuple or create your own specific argument class (e.g. like a class derived from EventArg like the ones used in EventHandlers).

xuyunhai 28-Sep-13 6:18am
seem have only two overload method.
one is none params,the other is explicitly pack them into an array.
Andreas Gieriet 28-Sep-13 16:06pm
Yes, that's what I say: it has a params array. See what params mean ( Checkout also the difference between refeence type and value type - or maybe more useful comparison: C# Concepts: Value vs Reference Types.

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

CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900