C#系统.Double&;到系统.双重的
本文关键字:系统 amp Double | 更新日期: 2023-09-27 17:58:17
我有一个类型变量t,其值表示引用,例如System。Double&或系统。双[]&。。现在我想创建一个类型为System的对象实例。Double或System。双[]。。。
问题编辑:
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
与号&
可能来自类型的CLR名称。它表示它是该类型的ByRef
版本。您是否从用ref
或out
关键字修饰的方法参数中获得了带有反射的Type
?
示例:
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
,也可以不是。
编辑后添加:
我强烈建议您使用typeof(string[])
,而不是例如Type.GetType("System.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
为什么一切都那么间接?