C# System.Double& 到 System.Double

cha*_*e87 -6 c# reference out gettype

我有类型变量 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());
Run Code Online (Sandbox Code Playgroud)

编辑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
Run Code Online (Sandbox Code Playgroud)

Jep*_*sen 5

& 符号&可能来自该类型的 CLR 名称。它表明它是该ByRef类型的一个版本。您是否从用or关键字Type修饰的方法参数中获得了 with 反射?refout

例子:

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"
Run Code Online (Sandbox Code Playgroud)

对于带有关键字的示例,假设您有一个如下所示的ref方法(在 type 内):Program

public static bool TestMethod(ref double d)
{
  return true;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

var t4 = typeof(Program).GetMethod("TestMethod").GetParameters()[0].ParameterType;
Console.WriteLine(t4);        // "System.Double&"
Run Code Online (Sandbox Code Playgroud)

同样,您可以&删除GetElementType().

和数组类型一样,也可以是ByRef也可以不是。


修改后补充:

Type.GetType("System.String[]")我强烈建议您使用而不是例如typeof(string[])。使用 C# 关键字要安全得多typeof

如果您想删除任何“尾随与号”,即如果您想删除存在的“ByRef”,您可以说:

Type t = param.ParameterType;
if (t.IsByRef)
    t = t.GetElementType();
Run Code Online (Sandbox Code Playgroud)

最后,您收到运行时异常的原因似乎是 的拼写错误Dobule。不会发生typeof(double)(拼写将在编译时检查)。

说起来要容易得多:

return " ";
Run Code Online (Sandbox Code Playgroud)

而不是你的:

return Activator.CreateInstance(Type.GetType("System.String"), new object[] { new char[] { ' ' } });
Run Code Online (Sandbox Code Playgroud)

并说:

return new double[10];
Run Code Online (Sandbox Code Playgroud)

而不是你的:

return Activator.CreateInstance(Type.GetType("System.Double[]"), new object[] { 10 }); // spelling error fixed
Run Code Online (Sandbox Code Playgroud)

为什么一切都如此间接?