我有Type变量t,其值代表参考,例如System.Double和放大器;或System.Double []&,... 现在我想用System.Double类型或System.Double [],...
创建一个对象实例问题编辑:
Type t = param.ParameterType;
if (t == Type.GetType("System.String&"))
return Activator.CreateInstance(Type.GetType("System.String"), new object[] { new char[] { ' ' } });
if (t == Type.GetType("System.Double[]&"))
return Activator.CreateInstance(Type.GetType("System.Dobule[]"), new object[] { 10 }); // throw Error !!!!
else
return Activator.CreateInstance(t.GetElementType());
编辑2: 我想实现这样的东西:
Type t = param.ParameterType;
if t is a reference to an array of any dimensions -> create its instance
if t is a ref to string -> create its instance
if t is a ref to any other data types -> create its instance
答案 0 :(得分:2)
&符号&
可能来自该类型的CLR名称。它表示它是该类型的ByRef
版本。您是否使用Type
或ref
关键字修饰的方法参数获得out
反射?
示例:
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"
对于使用ref
关键字的示例,假设您有一个方法(在类型Program
内),如下所示:
public static bool TestMethod(ref double d)
{
return true;
}
然后你可以这样做:
var t4 = typeof(Program).GetMethod("TestMethod").GetParameters()[0].ParameterType;
Console.WriteLine(t4); // "System.Double&"
同样,您可以使用&
删除GetElementType()
。
与数组类型相同,它也可以是ByRef
。
修改后的补充:
而不是例如Type.GetType("System.String[]")
我强烈建议您使用typeof(string[])
。使用C#关键字typeof
更安全。
如果你想摆脱任何“尾随&符号”,那就是如果你想要删除“ByRef”,你可以说:
Type t = param.ParameterType;
if (t.IsByRef)
t = t.GetElementType();
最后,您获得运行时异常的原因似乎是Dobule
的拼写错误。
typeof(double)
不会发生(拼写将在编译时检查)。
说起来要容易得多:
return " ";
而不是你的:
return Activator.CreateInstance(Type.GetType("System.String"), new object[] { new char[] { ' ' } });
并说:
return new double[10];
而不是你的:
return Activator.CreateInstance(Type.GetType("System.Double[]"), new object[] { 10 }); // spelling error fixed
为什么要把一切都这么间接?