473,385 Members | 1,630 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,385 software developers and data experts.

Delegate constructor types

The first type to a delegate constructor is obvious. It is a System::Object
* . What is the MC++ type of the second argument to the delegate constructor
? In C++ it would be a member function pointer when the first object is not
0, but I can't find its equivalent type in .NET. I would like to save an
object of that type and use that object to construct a delegate ? As an
example:

public __delegate void ADelegate();

__gc public class X
{
public:
void AMethod();
};

// Normally
X * myX = new X;
ADelegate * myADel = new ADelegate(myX,X::AMethod);
myADel(); // Calls myX::AMethod();

But let's suppose I want to save the actual method to be called, which is
the second argument to a delegate constructor. Is there a .NET type for this
? If there is, can I create an object of that type passing it a member
function ?

As an example, using the above delegate and class, let's suppose the .NET
type is called System::MemberReference and it takes a member function as a
parameter to its constructor. I could then do:

System::MemberReference * mObjMethod = new System::Method(X::AMethod);
// And then later
X * myX = new X;
ADelegate * myADel = new ADelegate(myX,mObjMethod);
myADel(); // Calls myX::AMethod();

Is this possible in some way ?

In standard C++ the concept of a member pointer exists as a pointer to a
member function of a particular class. It has the form of:

returnValue SomeClass::*SomeMethod(someParameters);

and one can say:

SomeMethod = SomeClass::AMethod;

as long as AMethod was a member function of SomeClass and had the same
signature as SomeMethod.

But I don't think I can use standard C++ when my object is a pointer to a
__gc class and my method is a member function of that __gc class.

Why would I want to do this in .NET, you say ? Because sometimes I don't
know until later what object of a certain type I want to use but I know the
member function(s) of a class of a particular signature I want to call. So
if I could create an instance of just a member function, equivalent to the
C++ member function pointer, I could pass that to another function which
will find the object, create the delegate and invoke it. I can't create the
delegate and pass that because I don't immediately know the object, but I do
know the member function(s). Finally the member function signature might be
one of a number of identical member functions of the same type for a
particular class, but the eventual code which invokes the delegate wouldn't
know or care about this. For what I want to do, C++'s ability to bind a
member function pointer to an object works better than .NET delegates which
automatically does the binding . Unfortunately I can not find out a .NET
equivalent to a C++ member function pointer in order to do this binding into
a delegate.
Nov 17 '05 #1
5 3596
You can do this as follows:

public __delegate void ADelegate();

__gc __interface IDelegateFactory {
ADelegate CreateDelegate(X *x);
};

__gc class DelegateFactoryForAMethod : public IDelegateFactory {
public:
ADelegate CreateDelegate(X *x) {
return new ADelegate(x, X::AMethod);
}
};

__gc class DelegateFactoryForBMethod : public IDelegateFactory {
public:
ADelegate CreateDelegate(X *x) {
return new ADelegate(x, X::BMethod);
}
};

IDelegateFactory *factory = new DelegateFactoryForAMethod();
// and then later
X * myX = new X;
ADelegate * myADel = factory->CreateDelegate(myX);
myADel(); // Calls myX::AMethod();

Greetings

Bart Jacobs

Nov 17 '05 #2
Bart Jacobs wrote:
You can do this as follows:

public __delegate void ADelegate();

__gc __interface IDelegateFactory {
ADelegate CreateDelegate(X *x);
};

__gc class DelegateFactoryForAMethod : public IDelegateFactory {
public:
ADelegate CreateDelegate(X *x) {
return new ADelegate(x, X::AMethod);
}
};

__gc class DelegateFactoryForBMethod : public IDelegateFactory {
public:
ADelegate CreateDelegate(X *x) {
return new ADelegate(x, X::BMethod);
}
};

IDelegateFactory *factory = new DelegateFactoryForAMethod();
// and then later
X * myX = new X;
ADelegate * myADel = factory->CreateDelegate(myX);
myADel(); // Calls myX::AMethod();


A good idea. Thanks !
Nov 17 '05 #3
Edward,
The first type to a delegate constructor is obvious. It is a System::Object * . What is the MC++ type of the second argument to the delegate constructor ? In C++ it would be a member function pointer when the first object is not 0, but I can't find its equivalent type in .NET. I would like to save an
object of that type and use that object to construct a delegate ?


An easier way would just be to use the CreateDelegate() static method of the
Delegate class. You can create the delegate using, for example, the object
instance and the name of the method.

--
Tomas Restrepo
to****@mvps.org
Nov 17 '05 #4
Tomas Restrepo (MVP) wrote:
Edward,
The first type to a delegate constructor is obvious. It is a
System::Object * . What is the MC++ type of the second argument to
the delegate constructor ? In C++ it would be a member function
pointer when the first object is not 0, but I can't find its
equivalent type in .NET. I would like to save an object of that type
and use that object to construct a delegate ?


An easier way would just be to use the CreateDelegate() static method
of the Delegate class. You can create the delegate using, for
example, the object instance and the name of the method.


I see the CreateInstance methods. Very cool !

Is there any overhead to using reflection ? Something tells me it is a bit
slower than the way which Mr. Jacobs suggested, which I do tend to prefer. I
am just a little old-fashioned in this respect, not having used reflection
much. C++ doesn't have it and, although Python and Java do have it, I
haven't used it there before.
Nov 17 '05 #5
Hi Edward,
I see the CreateInstance methods. Very cool !

Is there any overhead to using reflection ? Something tells me it is a bit
slower than the way which Mr. Jacobs suggested, which I do tend to prefer. I am just a little old-fashioned in this respect, not having used reflection
much. C++ doesn't have it and, although Python and Java do have it, I
haven't used it there before.


There is certainly some overhead to using reflection, but in many cases it
might not be very significant. I'd just do some profiling to try out,
because it's a really powerful feature (and in your case, it would indeed
save you a LOT of work if you're dealing with many delegate types!)

--
Tomas Restrepo
to****@mvps.org
Nov 17 '05 #6

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

Similar topics

2
by: Edward Diener | last post by:
The first type to a delegate constructor is obvious. It is an object * . What is the .NET type of the second argument to the delegate constructor ? Can I save an object of that type and use that...
4
by: Tim Werth | last post by:
I am trying to use reflection to add an event handler for the RowUpdated event of the OracleDataAdapter object (ODP.NET), but the same thing can be said for SqlDataAdapter if you only use...
15
by: Sharon | last post by:
I’m trying to build a generic Publisher-Subscriber that will work over the net, so I’m using the Remoting. I wish that the subscriber user will be notify about the messages sent by the...
6
by: Marty | last post by:
Hi, I would like to have my class to execute eventually an outside function. I was thinking to pass to my class constructor a delegate object that would be later used in my class to be...
3
by: IMS.Rushikesh | last post by:
Hi All, There is a scenario, in which there is a counter in my base class. There is some initial value of this counter (check below code). Now there is a function "DecreaseCount", which will...
6
by: RobKinney1 | last post by:
Hello, This may be an easy question, but I cannot stumle upon the correct way of doing this. I have a function in a base class. I then pass it to a class as a delegate so I don't have to...
10
by: Nathan Laff | last post by:
I have a custom attribute which i use for fields in an enum. I want to pass around a delegate in these things. so i want to do something like this Is this possible? i'm having no luck.
6
by: Sergey Poberezovskiy | last post by:
I have the following code in C# that I have trouble converting to VB(2.0): private delegate void openDialog(); private void openWindowsDialog(openDialog open) { Thread thread = new Thread(new...
26
by: raylopez99 | last post by:
Here is a good example that shows generic delegate types. Read this through and you'll have an excellent understanding of how to use these types. You might say that the combination of the generic...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
by: ryjfgjl | last post by:
In our work, we often need to import Excel data into databases (such as MySQL, SQL Server, Oracle) for data analysis and processing. Usually, we use database tools like Navicat or the Excel import...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...

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.