这个C#语法有什么作用?

时间:2011-07-28 15:30:45

标签: c# generics type-constraints

我正在阅读有关移动网络开发和ASP.NET MVC的帖子:http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx

在文章中,Scott Hanselman完成了创建自己的视图引擎以根据是否从移动Web浏览器请求网站来呈现不同视图的过程。

在他的MobileHelpers课程中,他有几种签名对我来说非常陌生的方法。这是一个例子:

        public static void AddMobile<T>(this ViewEngineCollection ves, Func<ControllerContext, bool> isTheRightDevice, string pathToSearch)        
        where T : IViewEngine, new()    
        {        
            ves.Add(new CustomMobileViewEngine(isTheRightDevice, pathToSearch, new T()));    
        }   

我已经使用了这样的内联函数(我认为这就是所谓的),但这种逻辑让我望而却步。我也不理解where T : ......行的目的。

你们能帮我理解这里发生的事情吗?

4 个答案:

答案 0 :(得分:7)

如果您能确定哪些部分特别令您感到困惑,那将会有所帮助。我已经选择了两个我认为最有可能基于你的问题,并解释了这些。如果有任何其他语法让您感到困惑,请编辑您的问题以解释哪个。

where T : IViewEngine, new()

的说明

C#允许您将constraints放在泛型类型参数上。您可以阅读有关约束here的更多信息。

在您的特定情况下,where T : IViewEngine表示T类型必须是IViewEngine类型的后代。 where T : new()是一种特殊语法,表示任何类型T必须具有默认构造函数。

this ViewEngineCollection ves

的说明

关键字this表示方法AddMobileViewEngineCollection类的扩展方法。这意味着除了被称为AddMobile(someViewEngineCollection, ...)之外,它还可以被称为someViewEngineCollection.AddMobile(...)。您可以阅读有关扩展方法here的更多信息。

答案 1 :(得分:5)

这称为扩展方法。第一个参数上的this修饰符允许调用该方法,就好像它是`ViewEngineCollection类型的实例方法一样。例如

ViewEngineCollection col = ...;
col.AddMobile<SomeType>(() => true, "thepath");

您提到的第二项where被称为通用约束。它将可用于T的类型集限制为具有公共无参数构造函数且派生自IViewEngine

的类型集

答案 2 :(得分:1)

this用于扩展方法。因此,对ViewEngineCollection的任何引用都有一个名为AddMobile的扩展方法。 where T : IViewEngine, new()被称为通用约束。

答案 3 :(得分:-1)

如果呼叫设备在其用户代理详细信息中包含标识信息(这通常是浏览器名称或webapp中的某些内容,则该方法旨在将自定义视图引擎与该设备的路由表相匹配。

它有点通用,没有上下文可能会让人感到困惑,但每个设备都以一种独特的方式识别自己(至少设备名称是唯一的)。

基本上这种方法是识别用于处理给定设备信息的正确的引擎。

由于其他人都试图解释约束和泛型,我以为我会把它留给专业人士......

http://msdn.microsoft.com/en-us/library/bb384067.aspx

......最好的方式......