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

时间:2015-08-03 02:05:14

标签: c# types activator createinstance

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

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中编码的值的实例。

无论解决方案如何,如果可能的话,我也想避免拳击。我不认为是,但我希望我错了。

2 个答案:

答案 0 :(得分:1)

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

Activator.CreateInstance(typeOfA);

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

答案 1 :(得分:1)

许多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

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