动态访问类中的字段

时间:2012-07-15 01:41:29

标签: c# .net-4.0 system.reflection

我在这里有这段代码,我试图将类的实例中的每个字段保存到单独的文件中。我把它全部写出来了,但有些东西看起来并不合适。问题是它不引用包含数据的实例,只包含类型。那对我来说似乎并不合适。我正在使用System.Reflection。现在,我如何引用实例?或者我已经并且不知道它。这是我的代码:

public static void Save(appData data)
{
    string filename;
    // this does not accept the variable "data", only the class spec "appData"
    var fields = typeof(appData).GetFields(BindingFlags.Instance);
    foreach (FieldInfo field in fields)
    {
        try
        {
            filename = (string)field.GetValue("dataFile");
        }
        catch (Exception e)
        {

            Console.WriteLine(e.Message);
            Console.ReadLine();
        }
        dataStream = new FileStream(filename,
            FileMode.Truncate, FileAccess.Write,
            FileShare.Read);
        serial.Serialize(dataStream, field );
        dataStream.Flush();
        dataStream.Close();
        dataStream = null;
    }

}

2 个答案:

答案 0 :(得分:2)

虽然您的代码不完整,但我想我可以告诉您要做的事情。

您的示例实际上是序列化FieldInfo对象,而不是字段。你想要替换:

filename = (string)field.GetValue("dataFile");

使用:

filename = field.Name;

同时替换:

serial.Serialize(dataStream, field );

使用:

serial.Serialize(dataStream, field.GetValue(data);

只需确保您的serial对象能够序列化所有字段。

答案 1 :(得分:0)

您没有正确调用FieldInfo.GetValue method。它的参数应该是要提取其字段值的对象,或者对于静态字段为null。

也许你想通过这个来实现:

filename = (string)field.GetValue("dataFile");

这是(假设数据是感兴趣的实例)?

if (field.Name == "dataFile")
{
    filename = (string)field.GetValue(data);
}