标题可能已经足够说了但我还是会解释它:
我的应用程序从随机数据源获取类似“bool”或“double”的字符串。我想要使用该字符串是为了创建一个具有该字符串中指定类型的实际对象。
所以像“int”这样的字符串会给我一个int类型的新对象。
这甚至可能吗?我已经看到一些使用switch-case结构的例子,但我宁愿看到一个已经实现的函数。
提前致谢!
答案 0 :(得分:6)
如果您可以将字符串形成为完全限定类型,则可以执行此类操作...
object num = Activator.CreateInstance(Type.GetType("System.Int32"));
答案 1 :(得分:4)
您可以使用Activator类创建给定类型的对象。它有很多方法,其中一些使用字符串来描述类型。虽然,请注意int
不是完全限定类型,但您需要使用System.Int32
答案 2 :(得分:3)
Activator.CreateInstance
应该可以做到这一点..
bool myVar = Activator.CreateInstance(Type.GetType("System.Boolean"));
答案 3 :(得分:0)
可以使用Activator.CreateInstance 方法,例如参数使用Type
,例如通过typeof(double)
答案 4 :(得分:0)
您可以使用动态关键字
string input = "int"
dynamic x = string.Empty;
switch(input)
{
case 'int':
x =34;
break;
case 'string':
x ="234";
break;
}
答案 5 :(得分:0)
这对于反射肯定是可能的。 Activator 类会创建指定类型的实例。有CreateInstance
个方法重载使用字符串类型名称。
答案 6 :(得分:0)
是的,这是可能的 - 最简单的实现是:
//case insensitive lookup and don't throw exception
Type t = Type.GetType(name, false, true);
if(t != null)
return Activator.CreateInstance(t);
Here's the MSDN topic我正在那里使用Type.GetType
重载。
然而,您会很快发现这有很多不足之处 - 尤其是name
必须是相关类型的程序集限定类型名称(除非它在mscorlib中。在这种情况下只是名称空间 - 合格的名字会做)。并且还需要一个默认构造函数(注意 - 一个带有所有可选参数的构造函数不计算在内) - 但我认为这可能是合理的。
此外,仿制药将会对此感到恐惧;但可能。
因此,您的下一步将是拥有string
到Type
的映射字典,您首先要咨询该字典,看看您是否定义了快捷方式:
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);
请注意,此处类型查找的大小写不敏感可能是也可能不合适 - 这取决于您希望系统的容易/灵活程度。