2012-07-15 53 views
0

我在这里有此代码,我试图将类的实例中的每个字段保存到单独的文件中。我把它全部写出来了,但是有些东西看起来并不正确。问题是它没有引用包含数据的实例,而只是类型。对我而言,这看起来不太合适。我正在使用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; 
    } 

} 
+0

你的代码看起来不完整:'serial.Serialize(dataStream,);'无效。 – 2012-07-15 01:47:44

+0

在那里,修好了。这是否让它变得更清晰? :) – 2012-07-15 01:53:35

+0

'serial'看起来并不像 – 2012-07-15 01:54:48

回答

2

虽然你的代码是不完整的,我想我可以告诉你想要做什么。

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

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

有:

filename = field.Name;

而且取代:

serial.Serialize(dataStream, field);

有:

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

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

+0

这个作品完美。我修改了一下,但是'getvalue'正是我一直在寻找的东西。 – 2012-07-16 17:31:41

0

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

也许你试图通过这个来实现:

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

是这样的(假设数据被关注的情况下)?

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

在这种情况下,他应该称为[FieldInfo.Name性质](http://msdn.microsoft.com/en-us/library/system.reflection.memberinfo.name.aspx)代替GetValue方法。 – 2012-07-15 02:12:22

+0

这不是你的代码所做的。 – 2012-07-15 02:13:03