如果您只有类型和值的字符串表示形式,您如何实例化已设置为特定值的类型的实例?

How can you instantiate an instance of a type, already set to a specific value, if you only have the string representation of the type and the value?

我有以下四个字符串;两对,每对都有一个表示值及其数据类型的字符串。

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);

...但我不确定如何创建设置为在其字符串表示形式 stringValueOfAstringValueOfB.

中编码的值的实例

无论采用何种解决方案,我也希望尽可能避免装箱。我不这么认为,但我希望我错了。

Activator.CreateInstance,使用无参数构造函数创建由指定泛型类型参数指定的类型的实例。您必须在创建实例后设置该值。

Activator.CreateInstance(typeOfA);

编译器使用 CreateInstance() 泛型方法来实现由类型参数指定的类型的实例化。阅读更多 here.

许多 BCL 类型,包括 StringInt32,都有关联的 类型转换器 ,可用于将字符串转换为这些类型的实例,反之亦然反之亦然。如果您正在使用其中一种类型,那么您可以像这样解析字符串:

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

注意:因为实际类型在编译时是未知的,所以值类型的装箱是不可避免的。