这个c#语法是做什么的?

本文关键字:什么 语法 这个 | 更新日期: 2023-09-27 18:04:04

我正在阅读一篇关于移动web开发和ASP的文章。. NETMVC: 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 : ......线的用途。

你们能帮我理解这里发生了什么吗?

这个c#语法是做什么的?

如果你能识别出你特别困惑的部分,这将会有所帮助。根据你的问题,我选择了我认为最有可能的两个,并解释了它们。如果还有其他语法让你困惑,请编辑你的问题来解释。

where T : IViewEngine, new()

说明

c#允许在泛型类型参数上放置约束。你可以在这里阅读更多约束。

在您的特殊情况下,where T : IViewEngine意味着无论T是什么类型,都必须是IViewEngine类型的后代。where T : new()是一种特殊的语法,它表明无论T是什么类型,都必须有一个默认构造函数。

this ViewEngineCollection ves

说明

关键字this表示AddMobile方法是ViewEngineCollection类的扩展方法。这意味着除了作为AddMobile(someViewEngineCollection, ...)调用之外,它还可以作为someViewEngineCollection.AddMobile(...)调用。您可以在这里阅读更多关于扩展方法的信息

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

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

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

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

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

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

本质上这个方法是识别正确的视图引擎用来处理给定的设备信息。

既然其他人都在试图解释约束和泛型,我想我应该把它留给专业人士…

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