2012-11-06 35 views
2

我希望能够遍历引用自己属性的类属性。你为什么会问?因为如果我想向该类添加更多属性,稍后管理会更容易。自引用属性数组

让我解释更多:

public interface IElementBox 
{ 
    string Filename { get; } 
    string FileDefinition { get; set; } 
    void ExtractFromFile(string stringData); 
} 

public abstract class Element 
{ 
    public Element(string stringData) 
    { 
     this.DefFromFile(stringData); 
    } 
    public string Name { get; set; } 
    protected abstract void DefFromFile(string stringData); 
} 

public class Solid : Element 
{ 
    public Solid(string stringData) : base(stringData) { } 
    public string SolidSpecificProperty { get; set; } 
    protected override void DefFromFile(string stringData) 
    { 
     // Assign SolidSpecificProperty from string 
    } 
} 

public class Liquid : Element 
{ 
    public Liquid(string stringData) : base(stringData) { } 
    public string LiquidSpecificProperty { get; set; } 
    protected override void DefFromFile(string stringData) 
    { 
     // Assign LiquidSpecificProperty from string 
    } 
} 

public class Gas : Element 
{ 
    public Gas(string stringData) : base(stringData) { } 
    public string GasSpecificProperty { get; set; } 
    protected override void DefFromFile(string stringData) 
    { 
     // Assign GasSpecificProperty from string 
    } 
} 

public abstract class ElementBox<T> : IElementBox where T : Element 
{ 
    public List<T> Elements { get; set; } 
    public List<T> GetElementsFromName(string name) 
    { 
     return this.Elements.FindAll(x => x.Name == name); 
    } 
    public abstract string Filename { get; } 
    public string FileDefinition { get; set; } 
    public abstract void ExtractFromFile(string filename); 
} 

public class SolidBox : ElementBox<Solid> 
{ 
    public override string Filename 
    { 
     get { return "Solid.txt"; } 
    } 
    public override void ExtractFromFile(string stringData) 
    { 
     this.Elements.Add(new Solid(stringData)); 
    } 
} 

public class LiquidBox : ElementBox<Liquid> 
{ 
    public override string Filename 
    { 
     get { return "Liquid.txt"; } 
    } 
    public override void ExtractFromFile(string stringData) 
    { 
     this.Elements.Add(new Liquid(stringData)); 
    } 
} 

public class GasBox : ElementBox<Gas> 
{ 
    public override string Filename 
    { 
     get { return "Gas.txt"; } 
    } 
    public override void ExtractFromFile(string stringData) 
    { 
     this.Elements.Add(new Gas(stringData)); 
    } 
} 

public static class DataDefinition 
{ 
    public static SolidBox SolidBox { get; set; } 
    public static LiquidBox LiquidBox { get; set; } 
    public static GasBox GasBox { get; set; } 

    public static IElementBox[] ElementBoxes = new IElementBox[] { DataDefinition.SolidBox, DataDefinition.LiquidBox, DataDefinition.GasBox }; 
} 

public static class Loader 
{ 
    public static void LoadInfo() 
    { 
     for (int elementBoxNb = 0; elementBoxNb < DataDefinition.ElementBoxes.Length; elementBoxNb++) 
     { 
      string dataFilepath = DataDefinition.ElementBoxes[elementBoxNb].Filename; 
      System.IO.StreamReader sr = System.IO.File.OpenText(dataFilepath); 
      DataDefinition.ElementBoxes[elementBoxNb].ExtractFromFile(sr.ReadToEnd()); 
     } 
    } 
} 

这种结构的全部目的是为了能够定义在一个文本文件中的所有对象的属性。这样就可以从该文本文件定义中动态分配所有SolidBox.Elements对象。

我的问题如下:

  • 请问属性数组DataDefinition通过值引用。这意味着我所有的数据分配都会被吸收到虚空中?

  • 如果是(或否),他们是一个更好的方式做整件事情/什么是最好的方式来做到这一点?

我一直在研究这个数据结构一段时间,现在我为我能实现的目标感到自豪。如果所有这些都是毫无价值的,我会感到难过。尽管如果你能为我提供一个更好的/最佳的方式来完成整个事情,我会很感激,并将我的代码放到我的存档文件夹中。

另外,请记住,这是数据结构的一个示例。它并不能完全反映我的代码的外观,并且是为了便于理解和阅读。

如果需要更多信息,请不吝提问。

+0

问题:为什么人人都不这样做? –

+0

关于属性数组。我想我会用一个指向正确索引或指针的枚举(我不知道)。然后,我将更改属性获取并设置为使用该枚举。该数组现在将成为唯一包含现在集中信息的地方,这些信息是按值分配工作的。我可能会使用Xml序列化来保存数据。感谢大家。 – user1801742

回答

1

反序列化(从持久性媒体中读取对象)已经被解决了数十种不同的方式。尝试使用数据合同,如this answer演示。你只需要在你的属性中添加一些属性来表明你想要序列化的东西,然后它为你做所有的工作。

+0

序列化不是我正在寻找的不幸的。用于初始化对象的文件应该保留一个文本文件。应该保持可读性并且可以修改的文本文件。如果我没有记错的话,序列化会产生一个相当复杂的文件,而不是用于编辑。谢谢你的答案。 – user1801742

+1

序列化是一个对象到媒体的持久性。它并不意味着任何级别的复杂性或可读性;这取决于实现者。二进制序列化是人类可读性最低的,而像Xml或甚至C#设计器代码这样的东西更具人类可读性(如果需要,可以序列化句子,但这不是机器可读的)。我个人认为Xml数据合同提供的是完全可读的,但它可能不适合你的目的。如果没有,你可以使用序列化的想法来编写你自己的序列化程序,它使用任何你想要的格式。 –

+0

谢谢。这是我认为我应该做的。我可能会去Xml序列化,希望这不会太难阅读。否则,我想我会为我自己的序列化程序。 – user1801742

0

这不会做你想要的。该数组将包含对属性在初始化时引用的对象的引用,在这种情况下,该属性将为null。如果您为SolidBox属性指定了某些内容,则该阵列的关联元素将不会更改,反之亦然。

+0

谢谢。这是我的。你有没有关于更好的做法的建议?感谢你的回答。 – user1801742