2016-07-30 137 views
3

我是C#的初學者。我在我的項目中遇到下面的代碼片段。我不明白如何在不傳遞任何參數的情況下調用ViewHelper.IsInView。任何人都可以解釋我這個。提前致謝。不通過參數調用的方法

public static class ViewHelper 
{ 
    public static bool IsInView(IFrameworkElement element) 
    { 
    ---------- 
    } 
} 

var Result = Views.Any(ViewHelper.IsInView); 
+0

沒有任何IsHelView在ViewHelper中的其他重載? –

+0

不,IsInView沒有任何重載 – SKN

+1

它使用當前視圖(包含左,上,寬,高)和傳遞元素(也有左,上,寬,高)。框架能夠通過名稱獲取屬性值。 – jdweng

回答

5

Any方法接受委託 - 一個指針指向一個函數 - 的形式Func<T, bool>的。這意味着它需要一種接受集合類型元素的方法(我猜你的案例中爲IFrameworkElement)並返回bool--這正是IsInView方法的簽名。

Any方法然後在Views集合中的元素上執行該委託,直到它遇到返回true的元素。

在C#中,存在從「方法組」到委託類型的隱式轉換。從本質上講,當你寫

Views.Any(ViewHelper.IsInView) 

它翻譯成

Views.Any(new Func<IFrameworkElement, bool>(ViewHelper.IsInView)) 
3

什麼被傳遞給Enumerable.Any代表,該方法沒有被調用,在這一點上。如果有任何意見,Any將調用該委託與一個或多個視圖作爲參數。

你傳遞給Any委託已通過一些被稱爲隱式方法組轉換創建。

Views.Any期待類型Func<IFrameworkElement, bool>的委託,這意味着它需要IFrameworkElement類型的單個參數,並返回bool。您可以從您的方法創建這樣的委託,因爲簽名是兼容的。這是你將如何明確做到這一點:

Func<IFrameworkElement, bool> predicate = 
    new Func<IFrameworkElement, bool>(ViewHelper.IsInView); 

然而,從C#2.0這種轉換可以做到隱含,這意味着該代碼是完全一樣的:

Func<IFrameworkElement, bool> predicate = ViewHelper.IsInView;