2012-11-06 58 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