2009-05-01 108 views
1

說我有這兩類嵌套類和遞歸

public class Container 
{ 
    public string name { get; set; } 
    public Inner Inner { get; set; } 
} 

public class Inner 
{ 
    public string text { get; set; } 
    public Inner2 Innert2 { get; set; } 
} 

public class Inner2 {} 

我將如何走,鑑於Container類的實例找到所有嵌套類的實例。只有真正關心的類不是字符串等

需要是通用的,以便如果內有一個類,它仍然會工作。此外,如果有一個類List<>IEnumerable它也需要找到它們。

乾杯。

+0

這不是一個嵌套類,但我知道你的意思。 http://msdn.microsoft.com/en-us/library/ms173120(VS.80).aspx – 2009-05-01 12:04:48

+0

代碼中的類之間沒有遞歸關係。容器包含一個Inner實例,它只包含一個文本屬性。請檢查您的示例。 – 2009-05-01 12:05:06

回答

2

使用反射將要走的道路recurively循環。這裏有一個簡單的代碼片斷,它可以讓你得到一個類的屬性,如果該屬性不是一個值類型,則遞歸地調用它自己。顯然,如果你想要使用Enums或IEnumerable成員的特定行爲,你需要添加它。

public void FindClasses(object o) 
{ 
    if (o != null) 
    { 
     Type t = o.GetType(); 
     foreach(PropertyInfo pi in t.GetProperties()) 
     { 
      if(!pi.PropertyType.IsValueType) 
      { 
       // property is of a type that is not a value type (like int, double, etc). 
       FindClasses(pi.GetValue(o, null)); 
      } 
     } 
    } 
} 
1

你的問題會工作,如果在您的示例代碼是這樣:

public class Container 
{ 
    public string name { get; set; } 
    public Inner Inner { get; set; } 
} 

public class Inner 
{ 
    public string text { get; set; } 
    public List<Inner> MoreInners { get; set; } 
} 

在這種情況下,你可以使用一個外部迭代器類做的工作,或者直接建立遞歸進入Container類。我會做後者:

public class Container 
{ 
    public string name { get; set; } 
    public Inner Inner { get; set; } 

    public List<Inner> SelectAllInner() 
    { 
     List<Inner> list = new List<Inner>(); 
     SelectAllInner(Inner, list); 
     return list; 
    } 

    private void SelectAllInner(Inner inner, List<Inner> list) 
    { 
     list.Add(inner); 
     foreach(Inner inner in MoreInners) 
      SelectAllInner(inner, list); 
    } 
} 

public class Inner 
{ 
    public string text { get; set; } 
    public List<Inner> MoreInners { get; set; } 
}