qua*_*els 1 c# generics type-constraints
我正在阅读有关移动Web开发和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()));
}
Run Code Online (Sandbox Code Playgroud)
我对这样的内联函数做了一些工作(我认为这就是他们所谓的),但这种逻辑让我望而却步.我也不明白这条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");
Run Code Online (Sandbox Code Playgroud)
您提到的第二个项目where称为通用约束.它限制了可以用于T具有公共无参数构造函数并从中派生的类型集IViewEngine