2016-07-30 70 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;