// Author:
// Miguel de Icaza (miguel@ximian.com)
// Daniel Stodden (stodden@in.tum.de)
+// Dietmar Maurer (dietmar@ximian.com)
//
// (C) Ximian, Inc. http://www.ximian.com
//
-// TODO: Mucho left to implement
-//
using System;
using System.Globalization;
using System.Reflection;
using System.Runtime.Serialization;
+using System.Runtime.CompilerServices;
+
namespace System {
protected object m_target;
protected string method_name;
protected IntPtr method_ptr;
+ protected IntPtr delegate_trampoline;
protected MethodInfo method_info;
protected Delegate (object target, string method)
// Methods
//
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal static extern Delegate CreateDelegate_internal (Type type, object target, MethodInfo info);
+
+ public static Delegate CreateDelegate (Type type, MethodInfo info)
+ {
+ if (type == null)
+ throw new ArgumentNullException (Locale.GetText ("Type is null"));
+
+ if (info == null)
+ throw new ArgumentNullException (Locale.GetText ("MethodInfo is null"));
+
+ return CreateDelegate_internal (type, null, info);
+ }
+
+ public static Delegate CreateDelegate (Type type, object target, string method)
+ {
+ if (type == null)
+ throw new ArgumentNullException (Locale.GetText ("Type is null"));
+
+ if (target == null)
+ throw new ArgumentNullException (Locale.GetText ("Target object is null"));
+
+ if (method == null)
+ throw new ArgumentNullException (Locale.GetText ("method string is null"));
+
+ BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
+ MethodInfo info = target.GetType ().GetMethod (method, flags);
+ return CreateDelegate_internal (type, target, info);
+ }
+
+ public static Delegate CreateDelegate (Type type, Type target, string method)
+ {
+ if (type == null)
+ throw new ArgumentNullException (Locale.GetText ("Type is null"));
+
+ if (target == null)
+ throw new ArgumentNullException (Locale.GetText ("Target type is null"));
+
+ if (method == null)
+ throw new ArgumentNullException (Locale.GetText ("method string is null"));
+
+ BindingFlags flags = BindingFlags.Public | BindingFlags.Static;
+ MethodInfo info = target.GetMethod (method, flags);
+ return CreateDelegate_internal (type, null, info);
+ }
+
+ public static Delegate CreateDelegate (Type type, object target, string method, bool ignorecase)
+ {
+ if (type == null)
+ throw new ArgumentNullException (Locale.GetText ("Type is null"));
+
+ if (target == null)
+ throw new ArgumentNullException (Locale.GetText ("Target object is null"));
+
+ if (method == null)
+ throw new ArgumentNullException (Locale.GetText ("method string is null"));
+
+ Type target_type = target.GetType ();
+ BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase;
+ MethodInfo info = target_type.GetMethod (method, flags);
+ return CreateDelegate_internal (type, target, info);
+ }
+
public object DynamicInvoke( object[] args )
{
return DynamicInvokeImpl( args );
public virtual object DynamicInvokeImpl( object[] args )
{
+ if (Method == null) {
+ Type[] mtypes = new Type [args.Length];
+ for (int i = 0; i < args.Length; ++i) {
+ mtypes [i] = args [i].GetType ();
+ }
+ method_info = m_target.GetType ().GetMethod (method_name, mtypes);
+ }
return Method.Invoke( m_target, args );
}
if ( o == null )
return false;
- if ( o.GetType() != this.GetType() )
- return false;
-
Delegate d = (Delegate) o;
if ((d.target_type == target_type) &&
(d.m_target == m_target) &&
{
Delegate retval = null;
- foreach ( Delegate next in delegates ) {
+ foreach ( Delegate next in delegates )
retval = Combine( retval, next );
- }
return retval;
}
throw new MulticastNotSupportedException ("");
}
- [MonoTODO]
- public static Delegate Remove( Delegate source, Delegate value) {
+
+ public static Delegate Remove( Delegate source, Delegate value )
+ {
if ( source == null )
return null;
- if ( value == null )
- return source;
-
- throw new NotImplementedException ();
+ return source.RemoveImpl( value );
}
- [MonoTODO]
- protected virtual Delegate RemoveImpl(Delegate d)
+ protected virtual Delegate RemoveImpl( Delegate d )
{
- throw new NotImplementedException();
+ if ( this.Equals( d ) )
+ return null;
+
+ return this;
}
public static bool operator ==( Delegate a, Delegate b )