2011-03-17 36 views
1

我正在創建一個允許指定根treenode,treenode屬性和值匹配的(遞歸)方法。如何編寫一個將動態搜索treeview的treenodes的方法?

SearchAllTreeNodes(rootNode, Tag, "foo"); 

在這個例子中,預期的方法將返回TreeNodeTag屬性字符串「foo」匹配。

我不知道如何處理的第二個參數的方法:

public static TreeNode SearchAllTreeNodes(TreeNode rootNode, /* ?? */, string Value) 
{ 
    /* ... */ 
} 

如何指定的對象我想檢查哪些特性?此外,是否有推薦的方法來處理多個值類型,或者我應該簡單地爲那些(int,bool)創建一些重載?

編輯:

感謝的答案提供我能夠完成以下方法:

public static TreeNode SearchAllTreeNodes(TreeNodeCollection nodeCollection, Func<TreeNode, bool> match) 
{ 
    foreach (TreeNode tn in nodeCollection) 
    { 
     if (match(tn)) return tn; 
     if (tn.Nodes.Count <= 0) continue; 
     TreeNode f = SearchAllTreeNodes(tn.Nodes, match); 
     if (f != null) return f; 
    } 
    return null; 
} 

調用,像這樣:

SearchAllTreeNodes(treeView.Nodes, node => node.Tag != null && (string)node.Tag == "foo") 

或:

SearchAllTreeNodes(treeView.Nodes, node => node.Tag != null && (int)node.Tag == 42) 

回答

3

我會去一個委託(在其中封裝與所需的值進行比較):

public static TreeNode SearchAllTreeNodes(TreeNode rootNode, Func<TreeNode, bool> match) 
{ 
    if (match(rootNode)) 
    { 
     /* ... */ 
    } 
} 

調用:

SearchAllTreeNodes(rootNode, node => node.Tag == "foo"); 
+0

同意。您可能還想看看訪客設計模式。 – neontapir 2011-03-17 20:17:22

+1

謝謝,這是完成工作的原因。 [(參考)](http://msdn.microsoft.com/en-us/library/bb549151.aspx)@neontapir感謝您的提示,我一定會了解這種設計模式[(參考)](http: //en.wikipedia.org/wiki/Visitor_pattern)。 – JYelton 2011-03-17 22:18:05

0
public static TreeNode SearchAllTreeNodes(TreeNode rootNode, Func<TreeNode, bool> matchCriteria, string Value) 
{ 
    if (matchCriteria != null) 
    { 
     var result = matchCriteria(rootNode); 
    } 
} 
1

我同意在其他的答案你應該讓委託來執行匹配,但是如果您確實想要指定屬性和值的方法,則可以使用反射並將屬性名稱指定爲字符串:

public static TreeNode SearchAllTreeNodes(TreeNode rootNode, string property, string value) 
{ 
    PropertyInfo propertyInfo = treeNode.GetType().GetProperty(property); 
    if (propertyInfo.GetValue(treeNode, null).ToString() == value) 
    { 
    /* Do stuff */ 
    } 
} 

public static void Main(string[] args) 
{ 
    /* ... */ 

    SearchAllTreeNodes(someNode, "Tag", "foo"); 
} 

當然,請記住,反射速度很慢,因此不建議通過大量比較運行上述代碼。您可以通過保持PropertyInfo對象並重用它來加速它,而不是每次都獲取它。

+0

感謝這個替代品,我想知道是否需要使用反射(但不確定它的實現)。 – JYelton 2011-03-17 22:12:33

相關問題