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)
& 符号&可能来自该类型的 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)
为什么一切都如此间接?
| 归档时间: |
|
| 查看次数: |
2321 次 |
| 最近记录: |