summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mcs/class/corlib/System.Reflection/MethodBase.cs13
-rw-r--r--mcs/class/corlib/Test/System.Reflection/BinderTests.cs87
2 files changed, 98 insertions, 2 deletions
diff --git a/mcs/class/corlib/System.Reflection/MethodBase.cs b/mcs/class/corlib/System.Reflection/MethodBase.cs
index 671f11d005..dd57144a21 100644
--- a/mcs/class/corlib/System.Reflection/MethodBase.cs
+++ b/mcs/class/corlib/System.Reflection/MethodBase.cs
@@ -88,8 +88,17 @@ namespace System.Reflection {
// This is a quick version for our own use. We should override
// it where possible so that it does not allocate an array.
//
- internal abstract ParameterInfo[] GetParametersInternal ();
- internal abstract int GetParametersCount ();
+ internal virtual ParameterInfo[] GetParametersInternal ()
+ {
+ // Override me
+ return GetParameters ();
+ }
+
+ internal virtual int GetParametersCount ()
+ {
+ // Override me
+ return GetParametersInternal ().Length;
+ }
internal virtual Type GetParameterType (int pos) {
throw new NotImplementedException ();
diff --git a/mcs/class/corlib/Test/System.Reflection/BinderTests.cs b/mcs/class/corlib/Test/System.Reflection/BinderTests.cs
index 33aea7c973..b0550788f4 100644
--- a/mcs/class/corlib/Test/System.Reflection/BinderTests.cs
+++ b/mcs/class/corlib/Test/System.Reflection/BinderTests.cs
@@ -101,6 +101,80 @@ namespace MonoTests.System.Reflection
}
}
+ class MethodInfoWrapper : MethodInfo
+ {
+ private readonly MethodInfo method;
+
+ public MethodInfoWrapper (MethodInfo method)
+ {
+ this.method = method;
+ }
+
+ public override object[] GetCustomAttributes (bool inherit)
+ {
+ return method.GetCustomAttributes (inherit);
+ }
+
+ public override bool IsDefined (Type attributeType, bool inherit)
+ {
+ return method.IsDefined (attributeType, inherit);
+ }
+
+ public override ParameterInfo[] GetParameters ()
+ {
+ return method.GetParameters ();
+ }
+
+ public override MethodImplAttributes GetMethodImplementationFlags ()
+ {
+ return method.GetMethodImplementationFlags ();
+ }
+
+ public override object Invoke (object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture)
+ {
+ return method.Invoke (obj, invokeAttr, binder, parameters, culture);
+ }
+
+ public override MethodInfo GetBaseDefinition ()
+ {
+ return method.GetBaseDefinition ();
+ }
+
+ public override ICustomAttributeProvider ReturnTypeCustomAttributes {
+ get { return method.ReturnTypeCustomAttributes; }
+ }
+
+ public override string Name {
+ get { return method.Name; }
+ }
+
+ public override Type ReturnType {
+ get { return method.ReturnType; }
+ }
+
+ public override Type DeclaringType {
+ get { return method.DeclaringType; }
+ }
+
+ public override Type ReflectedType {
+ get { return method.ReflectedType; }
+ }
+
+ public override RuntimeMethodHandle MethodHandle {
+ get { return method.MethodHandle; }
+ }
+
+ public override MethodAttributes Attributes {
+ get { return method.Attributes; }
+ }
+
+ public override object[] GetCustomAttributes (Type attributeType, bool inherit)
+ {
+ return method.GetCustomAttributes (attributeType, inherit);
+ }
+ }
+
+
[TestFixture]
public class BinderTest
{
@@ -1395,5 +1469,18 @@ namespace MonoTests.System.Reflection
null, // target
new object [] { CultureInfo.CurrentCulture, "foo{0}{1}", "bar", "baz" }));
}
+
+ public static void CustomMethodType_Helper ()
+ {
+ }
+
+ [Test]
+ public void CustomMethodType ()
+ {
+ var method = new MethodInfoWrapper (GetType ().GetMethod ("CustomMethodType_Helper"));
+
+ var res = Type.DefaultBinder.SelectMethod (BindingFlags.Static | BindingFlags.Public, new[] { method }, Type.EmptyTypes, new ParameterModifier[0]);
+ Assert.AreSame (method, res);
+ }
}
}