每个父对象都有一个Id每个子对象都有一个属性ParentId,用于标识像child.ParentId == parent.Id这样的唯一父对象。每个父对象都有属性Children
这个方法附加给每个父母子女的财产与父母匹配的孩子.Id == child.ParentId
private void AttachChildrenToParent(IEnumerable<dynamic> parents,
IEnumerable<dynamic> children)
{
parents.GroupJoin(
children,
p => p.Id,
c => c.ParentId,
(p, cn) => new { Parent = p, Children = cn })
.ToList().ForEach(x => x.Parent.Children = x.Children);
}
我的问题:
我实际上没有具有属性名称“Parent”“Children”的对象,而是我拥有表示子父关系的各种属性。所以我需要一个不对属性名称进行编码的泛型方法,并且我想要调用这样的方法。
任何人都可以帮助疲惫的大脑解决这个问题吗?
答案 0 :(得分:0)
我将在调用此函数时假设您知道父/子关系属性是什么。
然后我会建议你使用委托(这是真正的lambdas)来解决这个问题。我就是这样做的。您可能必须使用代码才能使其工作(我还没有对其进行测试),但希望它能让您沿着解决方案的道路前进。
public delegate Guid GetProperty<T>(T obj);
public delegate void AttachChildren<TParent, TChild>(TParent parent, IEnumerable<TChild> children);
private void AttachChildrenToParent<TParent, TChild>(IEnumerable<TParent> parents, IEnumerable<TChild> children, GetProperty<TParent> getID,
GetProperty<TChild> getParentID, AttachChildren<TParent, TChild> attachObjects)
{
parents.GroupJoin(
children,
p => getID(p),
c => getParentID(c),
(p, cn) => new { Parent = p, Children = cn })
.ToList().ForEach(x => attachObjects(x.Parent, x.Children));
}
private class Class1 { public Guid ID { get; set; } public IEnumerable<Class2> Children { get; set; } }
private class Class2 { public Guid ID { get; set; } public Guid ParentID { get; set; } }
private void test()
{
IEnumerable<Class1> lst1 = new List<Class1>();
IEnumerable<Class2> lst2 = new List<Class2>();
AttachChildrenToParent<Class1, Class2>(lst1, lst2, x => x.ID, x => x.ParentID, (x, y) => x.Children = y);
}