这种C#语法有什么作用?

这种C#语法有什么作用?,c#,generics,type-constraints,C#,Generics,Type Constraints,我正在这里阅读一篇关于移动web开发和ASP.NET MVC的帖子: 在本文中,Scott Hanselman经历了创建自己的视图引擎的过程,根据是否从移动web浏览器请求站点来呈现不同的视图 在他的MobileHelpers类中,他有几个带有签名的方法,这些方法对我来说非常陌生。下面是一个例子: public static void AddMobile<T>(this ViewEngineCollection ves, Func<ControllerConte

我正在这里阅读一篇关于移动web开发和ASP.NET MVC的帖子:

在本文中,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()));    
        }   
public static void AddMobile(此ViewEngineCollection ves,Func IstherRightDevice,字符串路径搜索)
其中T:IViewEngine,new()
{        
添加(新的CustomMobileViewEngine(isTheRightDevice、pathToSearch、new T());
}   
我曾经使用过一些类似这样的内联函数(我想这就是它们的名称),但我一直无法理解这种逻辑。我也不明白
其中t:..
行的用途


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

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

解释
其中T:IViewEngine,new()
C#允许您放置泛型类型参数。您可以阅读有关约束的更多信息

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

此ViewEngineCollection ves的说明

关键字
this
表示方法
AddMobile
ViewEngineCollection
类的扩展方法。这意味着除了被称为
AddMobile(someViewEngineCollection,…)
,它还可以被称为
someViewEngineCollection.AddMobile(…)
。您可以阅读更多有关扩展方法的信息。

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

解释
其中T:IViewEngine,new()
C#允许您放置泛型类型参数。您可以阅读有关约束的更多信息

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

此ViewEngineCollection ves的说明

关键字
this
表示方法
AddMobile
ViewEngineCollection
类的扩展方法。这意味着除了被称为
AddMobile(someViewEngineCollection,…)
,它还可以被称为
someViewEngineCollection.AddMobile(…)
。您可以阅读有关扩展方法的更多信息。

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

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

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

ViewEngineCollection col = ...;
col.AddMobile<SomeType>(() => true, "thepath");
ViewEngineCollection列=。。。;
col.AddMobile(()=>true,“路径”);

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

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

ViewEngineCollection col = ...;
col.AddMobile<SomeType>(() => true, "thepath");
ViewEngineCollection列=。。。;
col.AddMobile(()=>true,“路径”);

您提到的第二项,
,其中
,称为通用约束。它将可用于
T
的类型集限制为具有公共无参数构造函数并从呼叫设备在其用户代理详细信息中包含标识信息的
IViewEngine
派生的类型集(这通常是浏览器名称或webapp中的某个名称。该方法旨在将自定义视图引擎与该设备的路由表相匹配

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

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

因为其他人都在试图解释约束和泛型,我想我会把它留给专业人士


…真正的最佳方式…

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

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