【发布时间】:2012-01-31 01:06:40
【问题描述】:
我正在尝试将“MyClass”的实例序列化为一个 XML 文件,一次一个。每个实例都有一个名为“ID”的 int 属性。目标文件已经有一些相同类型的项目,我在这些项目之后附加了新项目。我希望要插入的实例的 ID 值比 XML 中最大的现有项高 1。
我有以下通用类:
public class ContentDataManager<T> where T : MyBaseClass
{
private static string _contentLocation = "Content/Data/";
private const string DEFAULT_FILEPATH = "data.xml";
public static int GetNextId(string filepath = DEFAULT_FILEPATH)
{
var allData = DeserializeAll(filepath);
int largestId = 0;
foreach (T data in allData)
{
if (data.ID > largestId)
{
largestId = data.ID;
}
}
return largestId + 1;
}
//...
}
我正在像这样使用这个类:
public class MyClass : MyBaseClass
{
public string Name;
public float Size;
public new int ID;
public static MyClass CreateNew(string name, float size)
{
MyClass newClass = new MyClass();
newClass.Name = name;
newClass.Size = size;
newClass.ID = ContentDataManager<MyClass>.GetNextId(DefaultFilepath);
return newClass;
}
MyBaseClass 如下所示:
public abstract class MyBaseClass
{
//...
[ContentSerializerIgnore]
public int ID = 0;
}
问题是,在 ContentDataManager.GetNextId(...) 方法的 foreach 循环中,有一个 if 语句实际上不能正常工作。在调试的时候,我添加了两个手表:'data'和'data.ID' 有趣的部分来了:'data' 的监视显示 ID 属性的值为 1。同时,'data.ID' 属性的值显示为 0。
我很确定这个错误与继承有关。我应该如何更改我的代码,以免出现此错误?
【问题讨论】:
-
为什么要使用
new运算符将ID隐藏在MyClass中的MyBaseClass中?该变量是公开的,并由您的MyClass继承。
标签: c# generics inheritance properties hierarchy