Click here to Skip to main content
15,895,709 members
Articles / Programming Languages / C#

Introducing the LinFu Framework, Part IV: Simple.IOC – The Five Minute Inversion of Control Container

Rate me:
Please Sign up or sign in to vote.
4.89/5 (25 votes)
15 Nov 2007LGPL312 min read 74.6K   626   41  
A fully functional, yet minimalistic inversion of control container
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;

namespace LinFu.Delegates
{
    public static class EventBinder
    {
        public static MulticastDelegate BindToEvent(string eventName, object source, CustomDelegate body)
        {
            if (source == null)
                throw new ArgumentNullException("source");
            
            // Find the matching event defined on that type
            Type sourceType = source.GetType();
            EventInfo targetEvent = sourceType.GetEvent(eventName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);

            if (targetEvent == null)
                throw new ArgumentException(
                    string.Format("Event '{0}' was not found on source type '{1}'", eventName, sourceType.FullName));

            // When the event fires, redirect call from the event
            // handler to the CustomDelegate body
            Type delegateType = targetEvent.EventHandlerType;
            MulticastDelegate result = DelegateFactory.DefineDelegate(delegateType, body);

            targetEvent.AddEventHandler(source, result);
            return result;
        }
        public static void UnbindFromEvent(string eventName, object source, MulticastDelegate target)
        {
            if (source == null)
                throw new ArgumentNullException("source");

            Type sourceType = source.GetType();
            EventInfo targetEvent = sourceType.GetEvent(eventName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);

            if (targetEvent == null)
                throw new ArgumentException(
                string.Format("Event '{0}' was not found on source type '{1}'", eventName, sourceType.FullName));

            Type delegateType = targetEvent.EventHandlerType;
            targetEvent.RemoveEventHandler(source, target);
        }

    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The GNU Lesser General Public License (LGPLv3)


Written By
Software Developer (Senior) Readify
Australia Australia
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions