这个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 : ......
线的用途。
你们能帮我理解这里发生了什么吗?
如果你能识别出你特别困惑的部分,这将会有所帮助。根据你的问题,我选择了我认为最有可能的两个,并解释了它们。如果还有其他语法让你困惑,请编辑你的问题来解释。
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…