.NET Forum / .NET Framework / General / January 2007
Programaticly call a method from a different object?
|
|
Thread rating:  |
schneider - 26 Jan 2007 15:14 GMT I'm looking for a way to programaticly call a method from a different object and associate the two objects at runtime.
Example: Object A exist and is unknow, I want object B to be able to call a method on object A whenever needed.
Like addhandler but I don't know what the method is and must discover it through reflection.
Maybe something like this:
Public Sub attach(ByVal valueA As Object)
Dim meth() As MethodInfo = value.GetType.GetMethods
Dim btnB As Button = New Button
Dim mitem As MethodInfo = meth(0) 'find the method I want somehow
AddHandler btnB.Click, mitem.[Selected_Method] '???
End Sub
Any ideas would be great.
Thanks,
Schneider
Ben - 26 Jan 2007 16:25 GMT Dim obj As Object = Nothing Dim methods As MethodInfo() = obj.GetType().GetMethods() Dim method As MethodInfo = FindTheMethodYouWant(methods) 'store class-level reference to "method" and "obj"... mTheMethod = method mTheObject = object AddHandler btnB.Click, AddressOf DoTheMethod ... end sub
private mTheMethod as Method private mTheObject as object
sub DoTheMethod() mTheMethod.Invoke(mTheObject, params) '(whatever the params are) end sub
> I'm looking for a way to programaticly call a method from a different object > and associate the two objects at runtime. [quoted text clipped - 24 lines] > > Schneider schneider - 27 Jan 2007 20:39 GMT Thanks Ben,
Was hoping for a cleaner approach, but that will work...
Schneider
> Dim obj As Object = Nothing > Dim methods As MethodInfo() = obj.GetType().GetMethods() [quoted text clipped - 43 lines] >> >> Schneider Nick Malik [Microsoft] - 29 Jan 2007 18:17 GMT What is the objective? Do you want to be able to develop a plug-in for your code, after the system is released, and have your system recognize it?
If so, that's covered loosly by traditional Design Patterns. I would recommend you investigate the Gang of Four Design Patterns, especially Strategy, Visitor, and Chain of Responsibility. (good reference on GoF patterns: http://home.earthlink.net/~huston2/dp/patterns.html )
Once you understand the design patterns that lead to frameworks, go ahead and dive into a light framwork like Spring.Net. Here's an article on Dependency Injection in .Net: http://msdn.microsoft.com/msdnmag/issues/05/09/DesignPatterns/default.aspx
 Signature --- Nick Malik [Microsoft] MCSD, CFPS, Certified Scrummaster http://blogs.msdn.com/nickmalik
Disclaimer: Opinions expressed in this forum are my own, and not representative of my employer. I do not answer questions on behalf of my employer. I'm just a programmer helping programmers. --
> I'm looking for a way to programaticly call a method from a different > object and associate the two objects at runtime. [quoted text clipped - 24 lines] > > Schneider schneider - 29 Jan 2007 23:07 GMT No, I know how to do a plug-in design, and already using it.
Trying to wire two methods together during runtime, similar to addhandler but method to be called is discovered by reflection.
Currently using the Ben pattern, I just thought I might me missing cleaner language feature...
Schneider
> What is the objective? Do you want to be able to develop a plug-in for > your code, after the system is released, and have your system recognize [quoted text clipped - 38 lines] >> >> Schneider Nick Malik [Microsoft] - 30 Jan 2007 16:32 GMT What's wrong with Visitor or Chain of Responsibility? You can set them up at runtime.
 Signature --- Nick Malik [Microsoft] MCSD, CFPS, Certified Scrummaster http://blogs.msdn.com/nickmalik
Disclaimer: Opinions expressed in this forum are my own, and not representative of my employer. I do not answer questions on behalf of my employer. I'm just a programmer helping programmers. --
> No, I know how to do a plug-in design, and already using it. > [quoted text clipped - 48 lines] >>> >>> Schneider schneider - 30 Jan 2007 17:00 GMT Look Nick the pattern is not the issue, I know what I want to do, and Ben seems to understand, it's a language detail.
Either read the prior messages or scram...
> What's wrong with Visitor or Chain of Responsibility? You can set them up > at runtime. [quoted text clipped - 51 lines] >>>> >>>> Schneider Nick Malik [Microsoft] - 31 Jan 2007 08:58 GMT You completely missed the point, I'm afraid.
In most cases, reflection is not necessary. A better design removes the need for the crutch. That's not to say that reflection is somehow bad, but when used as an alternative to simple, easily described patterns that use interfaces, declare intent, and are managed by the developer, and not 'self modifying code', reflection can open the door to a wide array of design issues that can make maintenance expensive.
I'm not criticizing the code. I'm expressing reservations about the need to use it.
If a gentleman comes to my door with his arms full of packages, opening the door is polite. If the packages are on fire, opening the door is quite inconsiderate and potentially self-destructive. You have asked me to open the door. I'm smelling smoke.
 Signature --- Nick Malik [Microsoft] Enterprise Application Architect http://blogs.msdn.com/nickmalik
Disclaimer: Opinions expressed in this forum are my own, and not representative of my employer. I do not answer questions on behalf of my employer. I'm just a programmer helping programmers. --
> Look Nick the pattern is not the issue, I know what I want to do, and Ben > seems to understand, it's a language detail. [quoted text clipped - 56 lines] >>>>> >>>>> Schneider Keith Patrick - 31 Jan 2007 00:41 GMT Is the method set that B needs to call a known, finite set? If so, can you have A's type implement an interface? That's generally how a plug-in is implemented, but if you're talking about wiring up objects of any type based on configuration values (I have an app that does this because it has to wire up a remotable event-listening system but predates WS-*), then you've got to you reflection to get the MethodInfo and call Invoke. The call is A.GetType().GetMethod("MethodName").Invoke(...)
schneider - 31 Jan 2007 15:17 GMT No the method is not know, in fact it's unknown user/developer code/library, and the reflection that I'm using are things used by the framework for similar things. As I explained earlier, a plug-in pattern does not work for me in this case, but I use it for other things. This needs to be loosely bound to be of any value to a developer.
Schneider
> Is the method set that B needs to call a known, finite set? If so, can you > have A's type implement an interface? That's generally how a plug-in is [quoted text clipped - 3 lines] > you've got to you reflection to get the MethodInfo and call Invoke. The > call is A.GetType().GetMethod("MethodName").Invoke(...) Keith Patrick - 31 Jan 2007 18:06 GMT In that case, I think GetType().GetMethod().Invoke() would be your best route. As Nick mentioned in another part of the thread, though, you're putting a lot of trust into what you're calling, basically becoming an operating system/runtime in itself, so I'd recommend restricting the permissions that are allowed in that execution call (run it in a .Net security-based sandbox within your app)
Free MagazinesGet these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...
|
|
|