- public class ExpandoObject : DynamicObject
- {
- public void AddMethod<T>(string methodName, Action<T> methodBody)
- {
- MulticastDelegate targetDelegate = methodBody;
- AddMethod(methodName, targetDelegate);
- }
- public void AddMethod(string methodName, Action methodBody)
- {
- MulticastDelegate targetDelegate = methodBody;
- AddMethod(methodName, targetDelegate);
- }
- public void AddMethod(string methodName, MulticastDelegate methodBody)
- {
- _methods.Add(methodName, methodBody);
- }
- public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
- {
- var methodName = binder.Name;
- result = null;
- if (!_methods.ContainsKey(methodName))
- return false;
- foreach (var currentDelegate in _methods[methodName])
- {
- var currentMethod = currentDelegate.Method;
- candidateMap[currentMethod] = currentDelegate;
- }
- var bestMatch = finder.GetBestMatch(candidateMap.Keys, context);
- if (bestMatch == null)
- return base.TryInvokeMember(binder, args, out result);
- var targetDelegate = candidateMap[bestMatch];
- var targetMethod = targetDelegate.Method;
- var target = targetDelegate.Target;
- result = targetMethod.Invoke(target, args);
- return true;
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- dynamic dynamicObject = expando;
- // Add the SayHello method
- expando.AddMethod("SayHello", () => Console.WriteLine("Hello, World!"));
- dynamicObject.SayHello();
- // Add the Say method
- expando.AddMethod<string>("Say", (message) => Console.WriteLine(message));
- dynamicObject.Say("Hello Again, World!");
- return;
- }
- }
An example that shows how one could use LinFu 2.x with C# 4.0's dynamic keyword to create types that can dynamically add methods to themselves at runtime.
