标题可能已经说得够多了,但我还是会解释一下:
我的应用程序从随机数据源中获取类似“bool”或“double”的字符串。我想要使用该字符串是创建一个具有该字符串中指定类型的实际对象。
所以像“int”这样的字符串会给我一个int类型的新对象。
这甚至可能吗?我见过一些使用 switch-case 结构的例子,但我更希望看到一个已经实现的函数。
提前致谢!
标题可能已经说得够多了,但我还是会解释一下:
我的应用程序从随机数据源中获取类似“bool”或“double”的字符串。我想要使用该字符串是创建一个具有该字符串中指定类型的实际对象。
所以像“int”这样的字符串会给我一个int类型的新对象。
这甚至可能吗?我见过一些使用 switch-case 结构的例子,但我更希望看到一个已经实现的函数。
提前致谢!
如果您可以将字符串形成为完全限定类型,您可以做这种事情......
object num = Activator.CreateInstance(Type.GetType("System.Int32"));
您可以使用Activator类来创建给定类型的对象。它有很多方法,其中一些使用字符串来描述类型。虽然请注意这int
不是完全限定的类型,但您需要使用System.Int32
Activator.CreateInstance
应该能够做到这一点..
bool myVar = Activator.CreateInstance(Type.GetType("System.Boolean"));
可以使用Activator.CreateInstance方法,其中像参数一样使用 a Type
,通过例如恢复,typeof(double)
您可以使用动态关键字
string input = "int"
dynamic x = string.Empty;
switch(input)
{
case 'int':
x =34;
break;
case 'string':
x ="234";
break;
}
使用反射当然可以做到这一点。Activator类创建指定类型的实例。有CreateInstance
使用字符串类型名称的方法重载。
是的,这是可能的——最简单的实现是:
//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 中。在这种情况下,只有命名空间限定名称就可以了)。并且还需要一个默认构造函数(注意 - 一个带有所有可选参数的构造函数不算在内) - 但我认为这可能是合理的。
另外 - 泛型对此将是可怕的;但有可能。
因此,您的下一步将是拥有一个映射字典,您首先要查阅该字典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);
请注意,此处的类型查找不区分大小写可能是可取的,也可能不是可取的——这取决于您希望系统变得多么容易/灵活。