簡體   English   中英

自引用屬性數組

[英]Self-Referential Property array

我希望能夠遍歷引用其自身屬性的類屬性。 你為什么會問? 因為如果以后我想向該類添加更多屬性,則更易於管理。

讓我解釋更多:

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中的屬性數組會被值引用嗎? 那將意味着我所有的數據分配都將被全部吸收?

  • 如果是(或否),那么他們是做這件事的更好方法嗎?/最好的方法是什么?

我從事該數據結構已有一段時間了,現在我為自己可以實現的目標感到自豪。 如果所有的事情一事無成,我會感到難過。 雖然,如果可以的話,如果可以為我提供更好/最佳的方式來完成整件事,我將不勝感激,並將我的代碼扔到我的存檔文件夾中。

另外,請記住,這是數據結構的示例。 它並不能完全反映我的代碼的外觀和編寫方式,從而簡化了理解和閱讀的過程。

如果需要更多信息,請隨時詢問。

反序列化(從持久性介質中讀取對象)已經解決了無數種不同的方式。 嘗試使用數據合同,如該答案所示。 您只需要在屬性中添加一些屬性來指示要序列化的內容,然后它就可以為您完成所有工作。

這不會做你想要的。 該數組將包含對初始化時屬性所引用的對象的引用,在這種情況下,該對象為null 如果將某些內容分配給SolidBox屬性,則數組的關聯元素將保持不變,反之亦然。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM