我如何使用Activator.CreateInstance与字符串?

时间:2010-01-19 09:47:07

标签: c# .net reflection activator

在我的反射代码中,我遇到了我的通用代码部分的问题。特别是当我使用字符串时。

var oVal = (object)"Test";
var oType = oVal.GetType();
var sz = Activator.CreateInstance(oType, oVal);

异常

An unhandled exception of type 'System.MissingMethodException' occurred in mscorlib.dll

Additional information: Constructor on type 'System.String' not found.

我试过这个用于测试目的,它也发生在这个单线程中

var sz = Activator.CreateInstance("".GetType(), "Test");

最初是我写的

var sz = Activator.CreateInstance("".GetType());

但我收到此错误

Additional information: No parameterless constructor defined for this object.

如何使用反射创建字符串?

5 个答案:

答案 0 :(得分:41)

请记住,字符串类是不可变的。创建后无法更改。这就解释了为什么它没有无参数构造函数,它永远不会生成除空字符串之外的有用字符串对象。这已经在C#语言中提供,它是“”。

相同的推理适用于string(String)构造函数。重复一个字符串是没有意义的,你传递给构造函数的字符串已经是一个非常好的字符串实例。

通过测试字符串大小写来解决您的问题:

var oType = oVal.GetType();
if (oType == typeof(string)) return oVal as string;
else return Activator.CreateInstance(oType, oVal);

答案 1 :(得分:5)

您正在尝试这样做:

var sz = new string();

尝试编译它,你就会明白你的错误。

您可以尝试:

var sz = Activator.CreateInstance(typeof(string), new object[] {"value".ToCharArray()});

但它看起来没用,你应该直接使用价值......

答案 2 :(得分:2)

看起来你正试图调用一个只接受字符串的构造函数 - 并且没有这样的构造函数。如果你已经得到一个字符串,你为什么要创建一个新字符串? (当你没有提供任何进一步的参数时,你试图调用一个无参数的构造函数 - 再次,它不存在。)

请注意,typeof(string)是获取字符串类型引用的更简单方法。

您能否向我们提供更多有关您正在尝试做的事情的更多信息?

答案 3 :(得分:2)

String实际上没有将字符串作为输入的构造函数。有一个构造函数接受一个char数组,所以这应该工作:

var sz = Activator.CreateInstance ("".GetType (), "Test".ToCharArray ());

答案 4 :(得分:2)

这是我在项目中使用的内容。至于需要创建一种对象类型的实例化并且在设计时不知道,对我来说是相当正常的。也许您正在循环访问对象属性,并且您希望动态地实例化所有这些属性。我有很多次需要创建然后为非实例化的POCO对象赋值...使用下面的代码,您可以使用存储在数据库中的字符串值来实例化对象,或者实例化存储在引用您的库的库中的对象库 - 所以你也可以绕过循环引用错误...希望它有所帮助。

{{1}}