我有以下四个字符串;两对,每一对都有一个表示值及其数据类型的字符串。
string stringValueOfA = "Hello World!";
string stringTypeOfA = "System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
string stringValueOfB = "44";
string stringTypeOfB = "System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
我知道我可以得到每种类型......
var typeOfA = Type.GetType(stringTypeOfA);
var typeOfB = Type.GetType(stringTypeOfB);
...我可以像这样激活所述类型的新实例......
var a = Activator.CreateInstance(typeOfA);
var b = Activator.CreateInstance(typeOfB);
...但我不确定如何创建设置为其字符串表示stringValueOfA
和stringValueOfB
中编码的值的实例。
无论解决方案如何,如果可能的话,我也想避免拳击。我不认为是,但我希望我错了。
答案 0 :(得分:1)
Activator.CreateInstance
,使用无参数构造函数创建由指定泛型类型参数指定的类型的实例。您必须在创建实例后设置该值。
Activator.CreateInstance(typeOfA);
编译器使用CreateInstance()泛型方法来实现类型参数指定的类型的实例化。阅读更多here。
答案 1 :(得分:1)
许多BCL类型(包括String
和Int32
)都有关联的类型转换器,可用于将字符串转换为这些类型的实例,反之亦然。如果您正在使用其中一种类型,那么您可以解析如下字符串:
public static object ConvertFromString(string typeName, string value)
{
Type type = Type.GetType(typeName, true);
TypeConverter converter = TypeDescriptor.GetConverter(type);
return converter.ConvertFromString(value);
}
样本用法:
object valueOfA = ConvertFromString(stringTypeOfA, stringValueOfA); // returns "Hello World!"
object valueOfB = ConvertFromString(stringTypeOfB, stringValueOfB); // returns 44 as an int
注意:因为在编译时不知道实际类型,所以值类型的装箱是不可避免的。