2

标题可能已经说得够多了,但我还是会解释一下:

我的应用程序从随机数据源中获取类似“bool”或“double”的字符串。我想要使​​用该字符串是创建一个具有该字符串中指定类型的实际对象。

所以像“int”这样的字符串会给我一个int类型的新对象。

这甚至可能吗?我见过一些使用 switch-case 结构的例子,但我更希望看到一个已经实现的函数。

提前致谢!

4

7 回答 7

6

如果您可以将字符串形成为完全限定类型,您可以做这种事情......

object num = Activator.CreateInstance(Type.GetType("System.Int32"));
于 2012-11-26T10:12:34.953 回答
4

您可以使用Activator类来创建给定类型的对象。它有很多方法,其中一些使用字符串来描述类型。虽然请注意这int不是完全限定的类型,但您需要使用System.Int32

于 2012-11-26T10:11:45.623 回答
3

Activator.CreateInstance应该能够做到这一点..

bool myVar = Activator.CreateInstance(Type.GetType("System.Boolean"));
于 2012-11-26T10:19:48.617 回答
0

可以使用Activator.CreateInstance方法,其中像参数一样使用 a Type,通过例如恢复,typeof(double)

于 2012-11-26T10:13:29.440 回答
0

您可以使用动态关键字

string input = "int"
dynamic x = string.Empty;

switch(input)
{
case 'int':
x =34;
break;
case 'string':
x ="234";
break;
}
于 2012-11-26T10:14:04.010 回答
0

使用反射当然可以做到这一点。Activator类创建指定类型的实例。有CreateInstance使用字符串类型名称的方法重载。

于 2012-11-26T10:15:27.570 回答
0

是的,这是可能的——最简单的实现是:

//case insensitive lookup and don't throw exception
Type t = Type.GetType(name, false, true);

if(t != null)
  return Activator.CreateInstance(t);

Type.GetType这是我在那里使用的重载的 MSDN 主题。

但是,您很快就会发现这有很多不足之处——尤其是name必须是相关类型的程序集限定类型名称(除非它在 ​​mscorlib 中。在这种情况下,只有命名空间限定名称就可以了)。并且还需要一个默认构造函数(注意 - 一个带有所有可选参数的构造函数不算在内) - 但我认为这可能是合理的。

另外 - 泛型对此将是可怕的;但有可能。

因此,您的下一步将是拥有一个映射字典,您首先要查阅该字典stringType查看您是否定义了快捷方式:

private Dictionary<string, Type> _knownTypes = 
  new Dictionary<string, Type>(StringComparer.OrdinalIgnoreCase);

private Type GetShortcutType(string name)
{
  Type toReturn = null;
  _knownTypes.TryGetValue(name, out toReturn);
  return toReturn; //returns null if not found
}

现在您可以将第一个代码示例中的类型查找行更改为:

Type t = GetShortcutType(name) ?? Type.GetType(name, false, true);

现在你只有一个设置方法来设置你的别名 - 它可以做到这一点:

_knownTypes["int"] = typeof(int);
_knownTypes["double"] = typeof(double);

请注意,此处的类型查找不区分大小写可能是可取的,也可能不是可取的——这取决于您希望系统变得多么容易/灵活。

于 2012-11-26T10:17:52.957 回答