C#System.Double&到System.Double

时间:2014-04-15 06:47:27

标签: c# reference out gettype

我有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

1 个答案:

答案 0 :(得分:2)

&符号&可能来自该类型的CLR名称。它表示它是该类型的ByRef版本。您是否使用Typeref关键字修饰的方法参数获得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

为什么要把一切都这么间接?