0

吉文斯:

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

}

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

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

我相信这可能是一个权限问题(公共/静态/内部/等),但我不确定究竟该怎么做才能纠正这个问题。我已经搜索过 SO 并且存在本质上类似的问题,但是它们没有提供任何关于静态类中的嵌套对象列表以及如何从其他静态类中正确访问它们的清晰见解。

4

1 回答 1

1

我已经删除了下面代码中的所有静态关键字。在这里, bar.Count 是可访问的。

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
{
}
于 2015-11-30T21:34:33.503 回答