> 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
