假设我有两个类(使用C#)。
A类和B类.A类可以转换为B.B类有一个属性Parent(类型B)。
我有一个List<A>
个A实例,我想将其转换为List<B>
。
A类包含了解B的哪个实例是父项的信息。
假设我通过我的List<A>
循环转换它。
for(int i = 0; i < listOfA.Count;i++)
{
listOfB.Add(ConvertToB(listOfA[i], listOfB));
}
ConvertToB方法创建一个B实例并搜索listOfB,如果它的父元素已经存在。
所以让我们说ConvertToB看起来像这样:
public B ConvertToB(A a, List<B> listOfB)
{
B newInstanceOfB = A as B;
B.Parent = listOfB.FirstOrDefault(x => x.Id == a.ParentId);
}
如果尚未转换父代码,则此代码将出错。 F.ex如果我们转换listofA [1],它的相应父级将是listofB [6]。在我们想要转换listofA [1]时将无法使用。
我的问题是如何以干净的面向对象的方式解决这个问题。可以使用什么样的设计模式(GOF)来解决这个问题。
修改
A是具有B也具有的一些属性的属性。 A和B无关。
B还可以列出允许的孩子。此List<B>
由属于listofB列表的项目组成。
所以f.ex:listofA [0]将被转换为listofB [0]。 listofB [0]有一个父listofB [4]并允许孩子{listofB [7],listofB [8]}
很抱歉没有提到这个。
答案 0 :(得分:2)
你真的需要一种设计模式吗?你可以做2个循环。首先将创建B实例,第二个将查找并设置父项。你甚至可以使用LINQ。
var listOfB = listOfA.Cast<B>().ToList()
foeach(var b in listOfB)
{
b.Parent = listOfB.FirstOrDefault(x => x.Id == b.ParentId); // this will work because there is clear inheritance so B has all properties A has
}
答案 1 :(得分:0)
从listOfA
到listOfB
的转换过于复杂而不仅仅是一个循环:您应该将其封装在一个方法中,让我们说:
public List<B> ConvertToListOfB(List<A> listOfA)
{
// The previous answer is quite good
}
如果您想为同一listOfA
添加多个listOfB
,则可以使用课程List<B>
的扩展方法:
public static class ListOfBEx
{
static void appendAll(this List<B> instance, List<A> listOfA)
{
// almost the same implementation
}
}
封装很好,因为在第一个循环之后,B的新实例处于不完整状态(缺少父级)。