我正在阅读有关移动网络开发和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 : ......
行的目的。
你们能帮我理解这里发生的事情吗?
答案 0 :(得分:7)
如果您能确定哪些部分特别令您感到困惑,那将会有所帮助。我已经选择了两个我认为最有可能基于你的问题,并解释了这些。如果有任何其他语法让您感到困惑,请编辑您的问题以解释哪个。
where T : IViewEngine, new()
C#允许您将constraints放在泛型类型参数上。您可以阅读有关约束here的更多信息。
在您的特定情况下,where T : IViewEngine
表示T
类型必须是IViewEngine
类型的后代。 where T : new()
是一种特殊语法,表示任何类型T
必须具有默认构造函数。
this ViewEngineCollection ves
关键字this
表示方法AddMobile
是ViewEngineCollection
类的扩展方法。这意味着除了被称为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
......最好的方式......