Присоединить детей к родительскому универсальному методу - PullRequest
1 голос
/ 16 декабря 2011

у каждого родителя есть Id, у каждого дочернего объекта есть свойство ParentId, которое идентифицирует уникальный родительский объект, такой как child.ParentId == parent.Id. У каждого родительского объекта есть свойство Children

.children, который соответствует parent.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", скорее, у меня естьвсе виды свойств, которые проявляют дочерние родительские отношения.Поэтому мне нужен универсальный метод, который не кодирует имя свойства и для которого я хочу вызвать метод, подобный этому.

Может ли кто-нибудь помочь уставшему мозгу решить эту проблему?

1 Ответ

0 голосов
/ 16 декабря 2011

Я предполагаю, что при вызове этой функции вы знаете, каковы родительские / дочерние реляционные свойства.

Тогда я бы предложил вам использовать делегатов (которые действительно являются лямбдами) для решения этой проблемы. Вот как бы я это сделал. Возможно, вам придется поиграться с кодом, чтобы заставить его работать (я не проверял его), но, надеюсь, он пойдет по пути к вашему решению.

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);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...