C# 动态访问类中的字段
这里有一段代码,我试图将类实例中的每个字段保存到一个单独的文件中。我把它都写出来了,但有些地方看起来不对劲。问题是它没有引用包含数据的实例,而只是引用类型。这在我看来并不完全正确。我正在使用System.Reflection。现在,如何引用该实例?或者我已经不知道了。这是我的密码:C# 动态访问类中的字段,c#,.net-4.0,system.reflection,C#,.net 4.0,System.reflection,这里有一段代码,我试图将类实例中的每个字段保存到一个单独的文件中。我把它都写出来了,但有些地方看起来不对劲。问题是它没有引用包含数据的实例,而只是引用类型。这在我看来并不完全正确。我正在使用System.Reflection。现在,如何引用该实例?或者我已经不知道了。这是我的密码: public static void Save(appData data) { string filename; // this does not accept the variable "data"
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;
}
}
虽然您的代码不完整,但我想我可以告诉您要做什么 您的示例实际上是序列化
FieldInfo
对象,而不是字段。您要替换:
filename=(string)field.GetValue(“数据文件”)代码>
与:
filename=field.Name代码>
还应替换:
serial.Serialize(数据流,字段)代码>
与:
serial.Serialize(数据流,字段.GetValue(数据);
只需确保所有字段都能被串行对象序列化。您没有正确调用。它的参数应该是要提取其字段值的对象,或者对于静态字段为null
也许你正试图通过以下方式实现:
filename = (string)field.GetValue("dataFile");
这是(假设数据是感兴趣的实例)
您的代码看起来不完整:serial.Serialize(dataStream,);
无效。在那里,已修复。这是否使它变得更清晰?:)serial
看起来不像是已定义的。您可以显示类型appData
的定义吗?看起来您正在尝试获取appData实例的“dataFile”成员的值。它是防止您直接访问它的私有字段吗?否,datafile变量是appData中每个字段都包含的字段,并且未序列化。它是在初始化appData或反序列化字段时分配的。它只是该字段的数据文件的文件路径。是的,它是公开的。此外,serial是一个二进制格式化程序。在这种情况下,他应该调用而不是GetValue方法。这非常有效。我对它做了一点修改,但是getvalue
正是我想要的。
if (field.Name == "dataFile")
{
filename = (string)field.GetValue(data);
}