无法访问静态类的数组的嵌套属性

本文关键字:数组 属性 嵌套 静态类 访问 | 更新日期: 2023-09-27 18:25:03

Givens:

  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;
    }
}

我也尝试过在FOO中使用嵌套类而不是struct,但这导致FOO抱怨我不能将类用作对象参数,这就是我使用struct的原因。

此代码没有语法错误。我可以公开FOO本身的属性等,并实例化结构的new(),但我看不到结构的属性。

我认为这可能是一个权限问题(public/static/internal/etc),但我不确定该如何纠正。我搜索了SO,发现了一些性质相似的问题,但它们并没有提供任何关于静态类中对象的嵌套列表以及如何从其他静态类中正确访问它们的明确见解。

无法访问静态类的数组的嵌套属性

我已经删除了下面代码中的所有静态关键字。给,酒吧。计数是可访问的。

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
{
}