Synopsis:
A callable object is an invokeable object that can be passed to, and returned from other functions.
Examples are .Net defined and custom delegates and lambdas.
A callable object has a specified signature, e.g., return type and parameter type sequence. The caller
has to know the signature in order to successfully use a callable object.
Here is demonstration code that creates an invoker that accepts any of these callable objects.
Code in File CallableObjects.cs
///////////////////////////////////////////////////////////////////// // CallableObjects.cs - demonstrate callable object invoker // // // // Jim Fawcett, CSE681 - Software Modeling and Analysis, Fall 2017 // ///////////////////////////////////////////////////////////////////// using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CallableObjects { public class InvokeCallable { public void invoke(Action act) { act.Invoke(); } } class TestCallableObjects { string msg_ = ""; delegate void MyDelegate(); void setMsg(string msg) { msg_ = msg; } void say() { Console.Write("\n Hi from {0}", msg_); } static void Main(string[] args) { Console.Write("\n Demonstrating Invoker of Callable Objects"); Console.Write("\n ==========================================="); TestCallableObjects tco = new TestCallableObjects(); InvokeCallable ic = new InvokeCallable(); // using method is easy tco.setMsg("class method"); ic.invoke(tco.say); // using lambda is easy ic.invoke(() => Console.Write("\n Hi from lambda")); // using Action delegate is easy tco.setMsg("Action delegate"); Action act = tco.say; ic.invoke(act); // using custom delegate is a bit messy // - uses reflection to get delegate's bound function tco.setMsg("custom delegate"); MyDelegate md = new MyDelegate(tco.say); Type t = md.GetType(); ic.invoke((Action)Delegate.CreateDelegate(typeof(Action), md, "Invoke")); Console.Write("\n\n"); } } }
Delegates Output:
Demonstrating Invoker of Callable Objects =========================================== Hi from class method Hi from lambda Hi from Action delegate Hi from custom delegate Press any key to continue . . .