Невозможно получить доступ к вложенному свойству массива статического класса
Гивенс:
- Класс должен быть доступен из другого класса, который должен быть статическим (без выбора).
- Класс FOO должен быть рекурсивным и поддерживать вложенный массив коллекции элементов с учетом структуры в примере.
- 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
{
}