我在这里有一个基础抽象类:
SELECT *
FROM #temptable
WHERE Reason_Comment != 'Paid In FUll' AND trans_code != 'X'
SELECT *
FROM #temptable
EXCEPT
SELECT *
FROM #temptable
WHERE Reason_Comment = 'Paid In FUll'
OR trans_code = 'X'
我有两个派生于
的课程public abstract class Group
{
public ParentGroup { get; set; }
}
因此,这两个类都可以访问ParentGroup属性。
我试图以递归方式为每个派生类分配ParentGroup属性。需要注意的是,GroupB有一个List组件,可以容纳Group类型的元素。
public class LeafA : Group
public class GroupB : Group
这是我试图以递归方式分配ParentGroup
的方法public List<Group> Groups { get; set; }
这只是一个示例,但如果我的GroupB GroupElement在组中有两个元素:1是GroupB,另一个是LeafA。 GroupB可以容纳x个Group,所以我想递归遍历所有这些子组并分配ParentGroup。 ParentGroup类似于 - &gt;
private void AssignParentGroup(GroupB GroupElement)
{
foreach (Group component in GroupElement.Groups)
{
if (component is GroupB)
{
// Recursive call here
}
}
}
希望这很清楚。如果我能解释,请告诉我。
答案 0 :(得分:3)
你可能正在寻找类似的东西:
private void AssignParentGroup(Group groupElement, Group parentGroup)
{
// the groupElement has always a ParentGroup property. assign it.
groupElement.ParentGroup = parentGroup;
// if the class is a GroupB, then is has subGroups. Pass the groupElement as parent.
if(groupElement is GroupB groupB)
foreach(var subGroup in groupB.Groups)
AssignParentGroup(subGroup, groupElement);
}
称之为:
AssignParentGroup(someGroup, null);
或者为第一次通话设置parentGroup
参数默认null
:
private void AssignParentGroup(Group groupElement, Group parentGroup = null)
您可以扩展此代码,并检查在LeafA
类
答案 1 :(得分:0)
我会通过实现访问者模式来解决这个问题。
首先,我将accept方法添加到我的抽象类中。
public abstract class Group
{
public Group ParentGroup { get; set; }
public abstract void Accept(GroupVisitor visitor);
}
我将为派生类实现样板文件。
public class LeafA : Group {
public override void Accept(GroupVisitor visitor){
visitor.Visit(this);
}
}
public class GroupB : Group
{
public List<Group> Groups {get;set;}
public override void Accept(GroupVisitor visitor) {
visitor.Visit(this);
}
}
然后像这样实现组访问者:
public class GroupVisitor {
private Group _parent;
public GroupVisitor(Group parent) {
_parent = parent;
}
public void Visit(LeafA leaf) {
leaf.ParentGroup = _parent;
}
public void Visit(GroupB group) {
group.ParentGroup = _parent;
var visitor = new GroupVisitor(group);
foreach (var item in group.Groups)
item.Accept(visitor);
}
}
因此,我们可以将父级分配给组层次结构,如下所示:
var visitor = new GroupVisitor(someGroup.ParentGroup);
someGroup.Accept(visitor);
这将同时处理父母与LeafA以及GroupB的分配。