2011-12-16 40 views
1

每個家長都有一個ID每個子對象具有標識像child.ParentId == parent.Id獨特的父母財產的ParentId每個父對象有屬性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); 
} 

我的問題:

我居然沒有用的屬性名稱「父」「子對象」,而我有各種屬性這表明了孩子的父母關係。所以我需要一個不編碼屬性名稱的泛型方法,並且爲此我想調用一個像這樣的方法。

任何人都可以幫助一個疲憊的大腦如何解決這個問題?

回答

0

我打算假設調用這個函數時你知道父/子關係屬性是什麼。

然後,我會建議你使用委託(這真的lambda)來解決這個問題。這是我會怎麼做的。你可能需要使用代碼才能使其運行(我還沒有測試過),但希望它可以讓你開始尋找解決方案。

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); 
     } 
+0

謝謝,很好用! – 2011-12-19 09:30:05