在我的反射代码中,我遇到了我的通用代码部分的问题。特别是当我使用字符串时。
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.
如何使用反射创建字符串?
答案 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}}