If you want to play with a bit of dark magic...
var ctors = typeof(__Class__To__Instantiate__).GetConstructors();
iterate through
var ctor = ctors[ *iteration* ];
iterate through params:
var param in ctor.GetParameters()
Gives you
param.Position {0,1,2... you already know that through iteration, though}
param.Name {important for some dark magic, but passing params in the right orders usually nullify that. Still, two instances of a similar parameterType could require that to differentiate them, for example, a player type}
param.ParameterType {this is what mostly matters. Here you'll have a lot of enum, numbers and the like. Combo with the name to identify everything}
Now, from there, you can, for example, try to grab the simplest constructor. Or, one with parameters you can easily create (aka, only built from enum, which, in turn, you can iterate through to get any). If you have a parameter named, say, width, try to see if the item you dupe doesn't have a Width(), getWidth() function or a width or _width inner variable. Even if those are private, you can easily grab them through reflection. Still, try to use the constructor that is the simplest for your dupe. Also, you might want to pre-answer common parameters if you see the same name and type in multiple instances of those failed dupes. Rather than try to guess an answer from the type and name, if you *know* the answer ahead of time, just hardcode it.
Best of luck!