13 c# reflection
我目前正在编写一些代码,使用c#中的反射将常规对象保存到XML.
问题是当在一些对象中读取XML时是结构体,而我无法弄清楚如何初始化结构体.对于我可以使用的课程
ConstructorInfo constructor = SomeClass.GetConstructor(Type.EmptyTypes);
Run Code Online (Sandbox Code Playgroud)
但是,对于结构体,没有没有参数的构造函数,因此上面的代码将构造函数设置为null.我也试过了
SomeStruct.TypeInitializer.Invoke(null)
Run Code Online (Sandbox Code Playgroud)
但这引发了一个元素的感知.谷歌没有提供有希望的点击率.任何帮助,将不胜感激.
Jon*_*eet 18
如果值是结构,则它们可能是不可变的 - 因此您不希望调用无参数构造函数,而是使用适当的值作为构造函数参数的构造函数.
如果结构不是不可变的,那么尽可能快地远离它们,如果可以......但是如果你必须这样做,那么使用Activator.CreateInstance(SomeClass).当您使用反射在值类型上设置属性或字段时,您必须非常小心 - 如果不小心,您最终将创建副本,更改该副本上的值,然后将其丢弃.我怀疑如果你一直使用盒装版本,你会没事的:
using System;
// Mutable structs - just say no...
public struct Foo
{
public string Text { get; set; }
}
public class Test
{
static void Main()
{
Type type = typeof(Foo);
object value = Activator.CreateInstance(type);
var property = type.GetProperty("Text");
property.SetValue(value, "hello", null);
Foo foo = (Foo) value;
Console.WriteLine(foo.Text);
}
}
Run Code Online (Sandbox Code Playgroud)
如果没有明确定义的构造函数,CreateInstance将无法帮助您。
FormatterServices.GetUninitializedObject(Type type);
Run Code Online (Sandbox Code Playgroud)
这可以解决空白结构的问题。
| 归档时间: |
|
| 查看次数: |
9823 次 |
| 最近记录: |