> Basically I want to write a function which accepts a
> typeof(MyDelegate) and
> is able to check if the MemberInfo of a method is bindable to
> this delegate.

The code below takes a strict view of what it means to be compatible (same
return type and argument list).  If you want something more along the lines
of the 2.0 model, you'll need to tweak it a bit.  But you get the idea.

-Mike
Bear Canyon Consulting LLC
http://www.bearcanyon.com
http://www.pluralsight.com/mike

// The code below looks much better without
// Outlook-induced line wrapping...

using System;
using System.Reflection;

class Program
{
  static void Main()
  {
    Type programType = typeof(Program);
    Type delegateType = typeof(EventHandler);

    Console.WriteLine("CompatibleMethod   : " +
IsMethodCompatibleWithDelegate(programType.GetMethod("CompatibleMethod"),
delegateType));
    Console.WriteLine("IncompatibleMethod1: " +
IsMethodCompatibleWithDelegate(programType.GetMethod("IncompatibleMethod1"),
delegateType));
    Console.WriteLine("IncompatibleMethod2: " +
IsMethodCompatibleWithDelegate(programType.GetMethod("IncompatibleMethod2"),
delegateType));
  }

  public static void CompatibleMethod( object sender, EventArgs args ) {}
  public static void IncompatibleMethod1() {}
  public static int IncompatibleMethod2( object sender, EventArgs args ) {
return(0); }

  static bool IsMethodCompatibleWithDelegate( MethodInfo targetMethod, Type
delegateType )
  {
    if( !typeof(Delegate).IsAssignableFrom(delegateType) )
    {
      throw new ArgumentException("The type specified must be derived from
System.Delegate", "delegateType");
    }

    MethodInfo delegateMethodInfo = delegateType.GetMethod("Invoke");

    // Same return type?
    //
    if( !ReferenceEquals(delegateMethodInfo.ReturnType,
targetMethod.ReturnType) )
    {
      return(false);
    }

    // Same argument count?
    //
    ParameterInfo[] targetMethodArgs = targetMethod.GetParameters();
    ParameterInfo[] delegateMethodArgs = delegateMethodInfo.GetParameters();

    if( targetMethodArgs.Length != delegateMethodArgs.Length )
    {
      return(false);
    }

    // Same argument types?
    //
    for( int n = 0; n < targetMethodArgs.Length; n++ )
    {
      if( !ReferenceEquals(targetMethodArgs[n].ParameterType,
delegateMethodArgs[n].ParameterType) )
      {
        return(false);
      }
    }

    // If we make it here, the target method has the same return type and
argument
    // list that's required by the delegate.
    //
    return(true);
  }
}

===================================
This list is hosted by DevelopMentorĀ®  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to