473,230 Members | 2,220 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,230 software developers and data experts.

Indirect method calls ... how to?

Is is possible in C# to have the equivalent of an array of function pointers in C?

I have a situation where a top level class exposes methods like Add, Delete, ... and a few
child classes with the same methods. Depending on a configuration parameter, the child
method will be invoked when the top level class is invoked.

I would like to avoid having to do something like this:

int configuration;

public bool Add()
{
switch (configuration)
{
case 1:
return ChildClass1.Add();
case 2:
return ChildClass2.Add();
}
}

I would rather have something like this instead (code not complete)

Arraylist MethodPTR;
int configuration;

public mainClassConstructor()
{
// Initialize MethodPTR with the address of the methods

MethodPTR = new ArrayList(8);
configuration = RetrieveConfiguration();

switch (configuration)
{
case 1:
MethodPTR[0] = ChildClass1.Add; // Assistance required here
MethodPTR[1] = ChildClass1.Delete; // Assistance required here
break;
case 2:
MethodPTR[0] = ChildClass2.Add; // Assistance required here
MethodPTR[1] = ChildClass2.Delete; // Assistance required here
break;
}
}

public bool Add()
{
return MedthoPTR[0](); // This is where I need assistance
}

public bool Delete()
{
return MedthoPTR[1](); // This is where I need assistance
}

Thank you all in advance.

Gaetan

Jan 30 '06 #1
8 3809
Not really any function pointers.

But....

Take a look at the Reflection classes.

You can get an object that represents a method (MethodInfo class) from a
class and then call the Invoke() method of it to actually execute it. You
could keep an array of MethodInfo objects and treat them sort of like
function pointers.

Also, you can Invoke() a method by using a string representation of the
method name as long as you have an instance of the object that contains it.

Hope this gives you some ideas!

--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Charles Cox
VC/VB/C# Developer
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

"Gaetan" <so*****@somewhere.com> wrote in message
news:jo********************************@4ax.com...
Is is possible in C# to have the equivalent of an array of function
pointers in C?

I have a situation where a top level class exposes methods like Add,
Delete, ... and a few
child classes with the same methods. Depending on a configuration
parameter, the child
method will be invoked when the top level class is invoked.

I would like to avoid having to do something like this:

int configuration;

public bool Add()
{
switch (configuration)
{
case 1:
return ChildClass1.Add();
case 2:
return ChildClass2.Add();
}
}

I would rather have something like this instead (code not complete)

Arraylist MethodPTR;
int configuration;

public mainClassConstructor()
{
// Initialize MethodPTR with the address of the methods

MethodPTR = new ArrayList(8);
configuration = RetrieveConfiguration();

switch (configuration)
{
case 1:
MethodPTR[0] = ChildClass1.Add; // Assistance required here
MethodPTR[1] = ChildClass1.Delete; // Assistance required here
break;
case 2:
MethodPTR[0] = ChildClass2.Add; // Assistance required here
MethodPTR[1] = ChildClass2.Delete; // Assistance required here
break;
}
}

public bool Add()
{
return MedthoPTR[0](); // This is where I need assistance
}

public bool Delete()
{
return MedthoPTR[1](); // This is where I need assistance
}

Thank you all in advance.

Gaetan

Jan 30 '06 #2
Well, first some comments than an answer to your questions.

1) Not really sure if your desired way is any better than the way you are
rejecting. You are still using a switch statement, you are just moving it
to a new location.
2) People who work on this after you may not understand what you are doing.
You would need to document this really well.
3) Although not a big issue, your way would not be as performant because
you are storing pointers to the methods. There would also be the overhead
of calling the methods. (again this is not a big deal, just thought I would
mention it.)

Now, for your answer. The .NET equivalent of function pointers are
Delegates. When you create a delegate, you tell it what method it should
wrap. You can then store the delegate for later use.

On a side note, let me offer some design comments (knowing full well that I
do not have knowledge of what you are trying to accomplish).

When you say "child class", are you referring to inherited subclasses? If
that is the case, then you might want to make Add abstract and then the
correct derived class method will be called, or you can have the base class
have an Add method and the derived classes have an AddImpl method incase you
need the base class to do some additional work. I might be able to offer a
better design if you wanted to share the relationship between the various
classes (i.e. inheritance, composition, etc.).

"Gaetan" <so*****@somewhere.com> wrote in message
news:jo********************************@4ax.com...
Is is possible in C# to have the equivalent of an array of function
pointers in C?

I have a situation where a top level class exposes methods like Add,
Delete, ... and a few
child classes with the same methods. Depending on a configuration
parameter, the child
method will be invoked when the top level class is invoked.

I would like to avoid having to do something like this:

int configuration;

public bool Add()
{
switch (configuration)
{
case 1:
return ChildClass1.Add();
case 2:
return ChildClass2.Add();
}
}

I would rather have something like this instead (code not complete)

Arraylist MethodPTR;
int configuration;

public mainClassConstructor()
{
// Initialize MethodPTR with the address of the methods

MethodPTR = new ArrayList(8);
configuration = RetrieveConfiguration();

switch (configuration)
{
case 1:
MethodPTR[0] = ChildClass1.Add; // Assistance required here
MethodPTR[1] = ChildClass1.Delete; // Assistance required here
break;
case 2:
MethodPTR[0] = ChildClass2.Add; // Assistance required here
MethodPTR[1] = ChildClass2.Delete; // Assistance required here
break;
}
}

public bool Add()
{
return MedthoPTR[0](); // This is where I need assistance
}

public bool Delete()
{
return MedthoPTR[1](); // This is where I need assistance
}

Thank you all in advance.

Gaetan

Jan 30 '06 #3
Check out .Net delegates. This is the equivalent of managed function
pointers.

--
HTH,

Kevin Spencer
Microsoft MVP
..Net Developer
Who is Mighty Abbott?
A twin turret scalawag.

"Gaetan" <so*****@somewhere.com> wrote in message
news:jo********************************@4ax.com...
Is is possible in C# to have the equivalent of an array of function
pointers in C?

I have a situation where a top level class exposes methods like Add,
Delete, ... and a few
child classes with the same methods. Depending on a configuration
parameter, the child
method will be invoked when the top level class is invoked.

I would like to avoid having to do something like this:

int configuration;

public bool Add()
{
switch (configuration)
{
case 1:
return ChildClass1.Add();
case 2:
return ChildClass2.Add();
}
}

I would rather have something like this instead (code not complete)

Arraylist MethodPTR;
int configuration;

public mainClassConstructor()
{
// Initialize MethodPTR with the address of the methods

MethodPTR = new ArrayList(8);
configuration = RetrieveConfiguration();

switch (configuration)
{
case 1:
MethodPTR[0] = ChildClass1.Add; // Assistance required here
MethodPTR[1] = ChildClass1.Delete; // Assistance required here
break;
case 2:
MethodPTR[0] = ChildClass2.Add; // Assistance required here
MethodPTR[1] = ChildClass2.Delete; // Assistance required here
break;
}
}

public bool Add()
{
return MedthoPTR[0](); // This is where I need assistance
}

public bool Delete()
{
return MedthoPTR[1](); // This is where I need assistance
}

Thank you all in advance.

Gaetan

Jan 30 '06 #4
Delegates are "function pointers" in .NET.

"C.C. (aka Me)" <me@home.com> wrote in message
news:jZ********************@comcast.com...
Not really any function pointers.

But....

Take a look at the Reflection classes.

You can get an object that represents a method (MethodInfo class) from a
class and then call the Invoke() method of it to actually execute it. You
could keep an array of MethodInfo objects and treat them sort of like
function pointers.

Also, you can Invoke() a method by using a string representation of the
method name as long as you have an instance of the object that contains
it.

Hope this gives you some ideas!

--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Charles Cox
VC/VB/C# Developer
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

"Gaetan" <so*****@somewhere.com> wrote in message
news:jo********************************@4ax.com...
Is is possible in C# to have the equivalent of an array of function
pointers in C?

I have a situation where a top level class exposes methods like Add,
Delete, ... and a few
child classes with the same methods. Depending on a configuration
parameter, the child
method will be invoked when the top level class is invoked.

I would like to avoid having to do something like this:

int configuration;

public bool Add()
{
switch (configuration)
{
case 1:
return ChildClass1.Add();
case 2:
return ChildClass2.Add();
}
}

I would rather have something like this instead (code not complete)

Arraylist MethodPTR;
int configuration;

public mainClassConstructor()
{
// Initialize MethodPTR with the address of the methods

MethodPTR = new ArrayList(8);
configuration = RetrieveConfiguration();

switch (configuration)
{
case 1:
MethodPTR[0] = ChildClass1.Add; // Assistance required here
MethodPTR[1] = ChildClass1.Delete; // Assistance required here
break;
case 2:
MethodPTR[0] = ChildClass2.Add; // Assistance required here
MethodPTR[1] = ChildClass2.Delete; // Assistance required here
break;
}
}

public bool Add()
{
return MedthoPTR[0](); // This is where I need assistance
}

public bool Delete()
{
return MedthoPTR[1](); // This is where I need assistance
}

Thank you all in advance.

Gaetan


Jan 30 '06 #5
> Is is possible in C# to have the equivalent of an array of function
pointers in C?

I have a situation where a top level class exposes methods like Add,
Delete, ... and a few child classes with the same methods. Depending
on a configuration parameter, the child method will be invoked when
the top level class is invoked.


I would use delegates for this. The following example is not very elegant
but, it shows the basic use of delegates and from what I read, it should
apply to your situation.

Chris

---

class Class1
{

[STAThread]
static void Main(string[] args)
{
Class1 class1 = new Class1(0);
Class1 class2 = new Class1(1);

class1.Add();
class1.Delete();

class2.Add();
class2.Delete();

Console.ReadLine();
}

public delegate void TakeCarOfStuffHandler();

TakeCarOfStuffHandler addHandler;
TakeCarOfStuffHandler deleteHandler;

public Class1(int i)
{
ChildClass1 class1 = new ChildClass1();
ChildClass2 class2 = new ChildClass2();

switch(i)
{
case 0:
addHandler = new TakeCarOfStuffHandler(class1.Add);
deleteHandler = new TakeCarOfStuffHandler(class1.Delete);
break;
case 1:
addHandler = new TakeCarOfStuffHandler(class2.Add);
deleteHandler = new TakeCarOfStuffHandler(class2.Delete);
break;
}
}

public void Add()
{
addHandler();
}

public void Delete()
{
deleteHandler();
}
}

class ChildClass1
{
public void Add()
{
Console.WriteLine("ChildClass1.Add()");
}

public void Delete()
{
Console.WriteLine("ChildClass1.Delete()");
}
}

class ChildClass2
{
public void Add()
{
Console.WriteLine("ChildClass2.Add()");
}

public void Delete()
{
Console.WriteLine("ChildClass2.Delete()");
}
}
Jan 30 '06 #6
I don't understand how your problem is different from standard
polymorphism:

public class Base
{
public virtual bool Add() { ... }
public virtual bool Delete() { ... }
}

public class Child : Base
{
public override bool Add() { ... }
public override bool Delete() { ... }
}

then

Base aBase = new Child();
aBase.Add();

I'm sure I'm missing something here... how do your requirements differ
from what's offered by polymorphism?

Jan 30 '06 #7

Thanks Peter for your explanations. I have taken a closer look at using either Delegates
or an abstract class. I think that what I'm trying to do could be more easily implemented
with a base class and derived classes.
On Mon, 30 Jan 2006 10:21:42 -0800, "Peter Rilling" <pe***@nospam.rilling.net> wrote:
Well, first some comments than an answer to your questions.

1) Not really sure if your desired way is any better than the way you are
rejecting. You are still using a switch statement, you are just moving it
to a new location.
2) People who work on this after you may not understand what you are doing.
You would need to document this really well.
3) Although not a big issue, your way would not be as performant because
you are storing pointers to the methods. There would also be the overhead
of calling the methods. (again this is not a big deal, just thought I would
mention it.)

Now, for your answer. The .NET equivalent of function pointers are
Delegates. When you create a delegate, you tell it what method it should
wrap. You can then store the delegate for later use.

On a side note, let me offer some design comments (knowing full well that I
do not have knowledge of what you are trying to accomplish).

When you say "child class", are you referring to inherited subclasses? If
that is the case, then you might want to make Add abstract and then the
correct derived class method will be called, or you can have the base class
have an Add method and the derived classes have an AddImpl method incase you
need the base class to do some additional work. I might be able to offer a
better design if you wanted to share the relationship between the various
classes (i.e. inheritance, composition, etc.).

Jan 30 '06 #8
Thanks Bruce ... this is the way I will go.

On 30 Jan 2006 10:37:17 -0800, "Bruce Wood" <br*******@canada.com> wrote:
I don't understand how your problem is different from standard
polymorphism:

public class Base
{
public virtual bool Add() { ... }
public virtual bool Delete() { ... }
}

public class Child : Base
{
public override bool Add() { ... }
public override bool Delete() { ... }
}

then

Base aBase = new Child();
aBase.Add();

I'm sure I'm missing something here... how do your requirements differ
from what's offered by polymorphism?

Jan 30 '06 #9

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: Matt Leslie | last post by:
I want to write a package to simulate a distributed system with objects at various locations interacting with each other. What I'd like to do is simulate network delays between distant objects...
1
by: Yasutaka Ito | last post by:
Hi, Given an object, I want to programmatically monitor it for any property changes and method calls. The object can be anything (component, control, etc.), and there is no guarantee that each...
0
by: Sham Ramakrishnan | last post by:
guys... I have a SOAP service at my clients that I have to use to call the exposed methods... well... there are supposedly 3 ways in which I can look at doing it... 1. Create a proxy for the...
4
by: Lawrence Oluyede | last post by:
I've never used metaclasses in real life before and while searching through the online Cookbook I found this gorgeous example: "Wrapping method calls (meta-class example)"...
4
by: Michael | last post by:
Hi, I'm having difficulty finding any previous discussion on this -- I keep finding people either having problems calling os.exec(lepev), or with using python's exec statement. Neither of...
0
by: Cody | last post by:
I will be using a FW that contains no documentation. In order to learn the FW, I would like to have a utility record all the method calls made while I run an application that uses the FW. I would...
0
by: JohnV | last post by:
Group, I'm writing a dotnet windows service that will create and maintain a collection of COM components. These components all implement the same interface, and some are written in VC++ 6 and...
1
by: Gurur | last post by:
how can we keep track of function and method calls without writing an inch of code in the method to trap the method name from outside the method. Do we have any function to keep track of all the...
0
bartonc
by: bartonc | last post by:
#----------------------------------------------------------------------------- # Name: ObjectRedirect.py # Purpose: Demonstrate class methode redirection with new-style classes # #...
3
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 3 Jan 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). For other local times, please check World Time Buddy In...
0
by: jianzs | last post by:
Introduction Cloud-native applications are conventionally identified as those designed and nurtured on cloud infrastructure. Such applications, rooted in cloud technologies, skillfully benefit from...
0
by: fareedcanada | last post by:
Hello I am trying to split number on their count. suppose i have 121314151617 (12cnt) then number should be split like 12,13,14,15,16,17 and if 11314151617 (11cnt) then should be split like...
0
by: stefan129 | last post by:
Hey forum members, I'm exploring options for SSL certificates for multiple domains. Has anyone had experience with multi-domain SSL certificates? Any recommendations on reliable providers or specific...
0
Git
by: egorbl4 | last post by:
Скачал я git, хотел начать настройку, а там вылезло вот это Что это? Что мне с этим делать? ...
0
by: MeoLessi9 | last post by:
I have VirtualBox installed on Windows 11 and now I would like to install Kali on a virtual machine. However, on the official website, I see two options: "Installer images" and "Virtual machines"....
0
by: DolphinDB | last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation. Take...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
by: Aftab Ahmad | last post by:
Hello Experts! I have written a code in MS Access for a cmd called "WhatsApp Message" to open WhatsApp using that very code but the problem is that it gives a popup message everytime I clicked on...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.