The ampersand & probably comes from the CLR name of the type. It indicates that it is a ByRef version of the type. Did you get the Type with reflection from a method parameter decorated with the ref or out keyword?
Example:
var t1 = typeof(double);
Console.WriteLine(t1); // "System.Double"
var t2 = t1.MakeByRefType();
Console.WriteLine(t2); // "System.Double&"
var t3 = t2.GetElementType();
Console.WriteLine(t3); // "System.Double"
Console.WriteLine(t1 == t3); // "True"
For an example with the ref keyword, suppose you have a method (inside a type Program) that looks like this:
public static bool TestMethod(ref double d)
{
return true;
}
Then you can do:
var t4 = typeof(Program).GetMethod("TestMethod").GetParameters()[0].ParameterType;
Console.WriteLine(t4); // "System.Double&"
Again, you can remove the & with GetElementType().
The same with the array type, it can also be ByRef or not.
Additions after edits:
Instead of e.g. Type.GetType("System.String[]") I strongly suggest you use typeof(string[]). It is much safer to use the C# keyword typeof.
If you want to get rid of any “trailing ampersand”, that is if you want to remove “ByRef” when present, you can say:
Type t = param.ParameterType;
if (t.IsByRef)
t = t.GetElementType();
Finally, the reason why you get a run-time exception seems to be a misspelling of Dobule.
Wouldn’t have happened with typeof(double) (spelling would be checked at compile-time).
And it is much, much easier to say:
return " ";
instead of your:
return Activator.CreateInstance(Type.GetType("System.String"), new object[] { new char[] { ' ' } });
and to say:
return new double[10];
instead of your:
return Activator.CreateInstance(Type.GetType("System.Double[]"), new object[] { 10 }); // spelling error fixed
Why make everything so indirect?
4
solved C# System.Double& to System.Double