Невозможно получить доступ к вложенному свойству массива статического класса

Гивенс:

  1. Класс должен быть доступен из другого класса, который должен быть статическим (без выбора).
  2. Класс FOO должен быть рекурсивным и поддерживать вложенный массив коллекции элементов с учетом структуры в примере.
  3. FOO должен быть полностью сериализуемым, включая все вложенные массивы и последующие элементы, включая XML (без использования хитрых трюков - просто прямая сериализация в xml, которая, кажется, поддерживает только один класс и будет автоматически находить вложенные классы / структуры соответственно)

Проблема в том, что я не могу сделать следующее, так как свойства FOOTabItem недоступны.

// can not be static
public class TestClass : SomeFancyInheritedObject { 

    // must be static
    public static void Test() {
        FOO.FOOTabItem bar = new FOOTabItem();

        bar.Count = 100;  // This is inaccessible
    }

}

Это код класса, из-за которого у меня возникают проблемы с отображением объектов:

public static class FOO {
    public static int Money { get; set; }

    public static List<FOOTab> Tabs { get; set; }


    public static struct FOOTab {
        public static List<FOOTabItem> Items { get; set; }

        public static FOOTab TabInformation { get; set; }
    }

    public static struct FOOTabItem {
        public static ItemInfo Item { get; set; }
        public static int Count { get; set; }

    }

    public static FOO() {
        Tabs = new List<FOOTab>();
        Money = 0;
    }

}

Я также пытался использовать вложенные классы вместо struct в FOO, однако это привело к тому, что FOO пожаловался, что я не могу использовать класс в качестве параметра объекта, поэтому я использую struct вместо.

С этим кодом нет синтаксических ошибок. Я могу выставить свойства / etc самого FOO и создать экземпляр new() из структур, однако я не могу видеть свойства структур.

Я полагаю, что это, скорее всего, проблема с разрешениями (public / static / internal / etc), но я не уверен, что именно нужно сделать, чтобы это исправить. Я искал SO, и есть проблемы, схожие по своей природе, однако они не дают четкого представления о вложенных списках объектов внутри статических классов и о том, как правильно обращаться к ним из других статических классов.

1 ответ

Решение

Я удалил все статические ключевые слова в коде ниже. Здесь бар. Счет доступен.

public class TestClass : SomeFancyInheritedObject 
{ 
    public static void Test() {
        FOO.FOOTabItem bar = new FOO.FOOTabItem();
        bar.Count = 100; // This is now accessible
    }
}
public class FOO {
    public int Money { get; set; }
    public List<FOOTab> Tabs { get; set; }

    public FOO() {
        Tabs = new List<FOOTab>();
        Money = 0;
    }

    public struct FOOTab {
        public List<FOOTabItem> Items { get; set; }
        public FOOTab()
        {
            Items = new List<FOOTabItem>();
        }
    }

    public struct FOOTabItem {
        public ItemInfo Item { get; set; }
        public int Count { get; set; }
    }
}

ОБНОВЛЕНИЕ: В ответ на ваш комментарий, вот код, который я протестировал в VS:

class Program
{
    public static void Main(string[] args)
    {
        var foo = new FOO();
        var x = new XmlSerializer(typeof(FOO));
        using (var memoryStream = new MemoryStream())
        {
            using (var writer = new StreamWriter(memoryStream))
            {
                x.Serialize(writer, foo);
            }
        }
    }
}

public class FOO
{
    public int Money { get; set; }
    public List<FOOTab> Tabs { get; set; }

    public FOO()
    {
        Tabs = new List<FOOTab>();
        Money = 0;
    }

    public class FOOTab
    {
        public List<FOOTabItem> Items { get; set; }
        public FOOTab()
        {
            Items = new List<FOOTabItem>();
        }
    }

    public class FOOTabItem
    {
        public ItemInfo Item { get; set; }
        public int Count { get; set; }
    }
}

public class ItemInfo
{
}
Другие вопросы по тегам