dynamitey
dynamitey copied to clipboard
InvalidCastException thrown from InvokeConstructor if passing more than 14 params arguments
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);
}
}
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.
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.
this seems to be related to emitting the callsite delegate for constructors above 14 arguments InvokeHelper.cs#L468