今天我在我们的代码库中找到了一颗宝石...
[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/