今天我在我们的代码库中找到了一颗宝石...

[Serializable]
public class MonsterClass
{
    // Interfaces are good, especially for testing
    public IEnumerable<FooBar> FooBars
    {
        get { return m_FooBars; }

        // rationale = clever linq performance trick/safeguard
        set { m_FooBars = new List(value); }
    }

    // alas ... it is serializable, thus we REQUIRE, it to be a List
    private List<FooBar> m_FooBars;

    //...
    //ton loads of methods, performing tricks on list of FooBar and other types
    //...
}


我想通过删除所有执行的方法来重构这个Monsterclass
IEnumerable 进入新的FooBarList类。

问题:以下内容是否可以安全替代?虽然它仍然可以序列化!

[Serializable]
public class FooBarList : List<FooBar>, IEnumerable<FooBar>
{
    public FooBarList(IEnumerable<FooBar> fooBars)
    {
        this = new List<FooBar>(fooBars);
    }

    //move specific methods here
}

[Serializable]
public class MonsterClass
{
    public FooBarList FooBars { get; set; }

    //still monsterclass, but now the FooBars are refactored out
}


还是一个更好的主意,并通过使用扩展方法来采取懒惰/小鸡的出路?
(旁注:由于性能影响和重构时间的缘故,我通过在两者之间添加域模型和适配器来排除重构此类的可能性)

最佳答案

您不会通过使用自定义类来完成任何事情。如果您不希望此类抽象出需要存储List而不是IEnumerable的事实,则将属性设置为List并强制调用者转换任何非List 他们已经进入了一个列表(考虑到他们仍然需要做与您的自定义列表相同的士气)。

那时,这只是一个问题,即此类的使用者是否认为能够分配一个任意的非List IEnumerable而不先将其转换为列表是否有用,或者此类的复杂性是否是有用的?对你来说不值得。

关于c# - 具有IEnumerable属性和列表成员的可序列化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40684221/

10-14 10:50