【问题标题】:Self-Referential Property array自引用属性数组
【发布时间】:2012-11-06 02:51:36
【问题描述】:

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

让我解释一下:

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 中的属性数组是否会被值引用。这意味着我所有的数据分配都会被虚空吸收?

  • 如果是(或否..),他们是做整个事情的更好方法吗/最好的方法是什么?

我研究这种数据结构已有一段时间了,现在我为自己能取得的成就感到自豪。如果这一切都是徒劳的,我会很难过。不过,如果您能为我提供一种更好/最佳的方式来完成整个工作,我将不胜感激,并将我的代码放入我的存档文件夹中。

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

如果需要更多信息,请随时提问。

【问题讨论】:

  • 问题:为什么不是每个人都这样做?
  • 关于属性数组。我想我会使用一个指向正确索引或指针的枚举(我不知道)。然后,我将更改属性 get 和 set 以使用该枚举。该数组现在将是唯一包含围绕按值分配工作的集中信息的地方。我可能会使用 Xml 序列化来进行数据持久化。谢谢大家。

标签: c# arrays generics properties interface


【解决方案1】:

反序列化(从持久性介质中读取对象)已通过无数种不同的方式得到解决。尝试使用数据协定,就像 this answer 演示的那样。您只需要向您的属性添加一些属性来指示您想要序列化的内容,然后它就会为您完成几乎所有的工作。

【讨论】:

  • 不幸的是,序列化不是我想要的。用于初始化对象的文件应该是一个文本文件。一个应该保持可读并且可以修改的文本文件。如果我没记错的话,序列化会产生一个看起来相当复杂的文件,而不是用来编辑的。谢谢你的回答。
  • 序列化是一个对象到一个介质的持久化。它并不意味着任何级别的复杂性或可读性;这取决于实施者。二进制序列化是人类可读性最低的,而像 Xml 甚至 C# 设计器代码这样的东西更易于人类阅读(如果需要,您可以序列化句子,但这不是机器可读的)。我个人认为 Xml 数据合约提供的可读性很好,但它可能不适合您的目的。如果没有,您可以使用序列化的思想编写自己的序列化程序,使用您想要的任何格式。
  • 谢谢。这是我认为我应该做的。我可能会进行 Xml 序列化,希望这不会使其难以阅读。否则,我想我会使用自己的序列化程序。
【解决方案2】:

这不会做你想要的。该数组将包含对属性在初始化时引用的对象的引用,在本例中为null。如果你给SolidBox 属性赋值,则数组的关联元素不会改变,反之亦然。

【讨论】:

  • 谢谢。我就是这样。不过,您对更好的方法有什么建议吗?感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
相关资源
最近更新 更多