dynamitey icon indicating copy to clipboard operation
dynamitey copied to clipboard

InvalidCastException thrown from InvokeConstructor if passing more than 14 params arguments

Open jbtule opened this issue 11 years ago • 3 comments

from ekonbenefits/impromptu-interface#9: by @jdh28

I have a class that I'm creating dynamically via Dynamic.InvokeConstructor that has params arguments. If I pass in 14 arguments it works, but 15 causes an InvalidCastException:

System.InvalidCastException: The result type 'MyClass' of the dynamic binding produced by binder 'Microsoft.CSharp.RuntimeBinder.CSharpInvokeConstructorBinder' is not compatible with the result type 'System.Type' expected by the call site.

Here is some example code:

    class Program
    {
        static void Main(string[] args)
        {
            var parameters = Enumerable.Range(0, 15).Select(i => i.ToString() as object).ToArray();
            var instance = Dynamic.InvokeConstructor(typeof(MyClass), parameters);
            Console.Out.WriteLine(instance.Args);
        }
    }


    public class MyClass
    {
        public readonly string Args;

        public MyClass(params string[] args)
        {
            Args = String.Join(",", args);
        }
    }

jbtule avatar Feb 04 '14 16:02 jbtule

This is certainly a bug. A workaround is:

var parameters = Enumerable.Range(0, 15).Select(i => i.ToString()).ToArray();
var instance = Dynamic.InvokeConstructor(typeof(MyClass), new object []{ parameters});
Console.Out.WriteLine(instance.Args);

But I'll need to look into fixing this.

jbtule avatar Feb 04 '14 16:02 jbtule

The workaround doesn't seem to work for me; I'd have to cast my parameters to 'string' rather than 'object'. I also need to be able to construct types with signatures like:

public MyClass(string firstArg, params string[] otherArgs)

and I was relying on the library to sort that out for me.

jdh28 avatar Feb 04 '14 16:02 jdh28

this seems to be related to emitting the callsite delegate for constructors above 14 arguments InvokeHelper.cs#L468

jbtule avatar Feb 04 '14 16:02 jbtule