【问题标题】:What does this C# syntax do?这个 C# 语法有什么作用?
【发布时间】:2016-12-13 01:54:43
【问题描述】:

我正在阅读一篇关于移动 Web 开发和 ASP.NET MVC 的文章:http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx

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

在他的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 : ...... 行的目的。

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

【问题讨论】:

  • @James,已经有 4 个答案准确地说明了这一点。 :) 另外,`,不是 ' :)
  • @bzlm 是的,我很着急,没注意。不知道为什么我没有得到说还有其他答案可用的对话框。嗯嗯。

标签: c# generics type-constraints


【解决方案1】:

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

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

【讨论】:

  • 这是正确的。再举一个例子,你可以说where T : Exception,这将允许类型T成为一个异常,或者任何从异常派生的类。
  • 这两个。感谢额外的资源。
【解决方案2】:

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

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

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

【讨论】:

  • 我没有意识到扩展方法。至少,我知道它,但它从来没有和我“点击”过。这很简单,我一直用 Html Helpers 来做这件事。但是,现在我对正在发生的事情有了更深入的了解!
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    它有点通用,没有上下文可能会很混乱,但每个设备都以独特的方式标识自己(至少在设备名称上是唯一的)。

    本质上,这种方法是识别正确的查看引擎来处理给定的设备信息。

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

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

    ...最好的方法真的...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 2012-04-02
      相关资源
      最近更新 更多