首页 > 解决方案 > 有人能解释一下这个语法吗:QueryService(这个IServiceProvider serviceProvider,out T service) where T : class

问题描述

我在一个 C# 项目(我不记得是哪一个)上看到了一段代码,如下所示:

public static class ComExt
{
    // ... blablabla ...

    static public void QueryService<T>(this IServiceProvider serviceProvider, out T service) where T : class
    {
        // ... blablabla ...
    }

    static public int QueryInterface(this object provider, ref Guid riid, ref IntPtr ppvObject)
    {
        // ... blablabla ...
    }

但在第一种方法中,我不懂语法。尤其是QueryService<T>(this) where T : class

有人可以向我解释这种方法发生了什么吗?也许还有其他使用该语法的示例?

谢谢 :)

标签: c#methodssyntax

解决方案


你的问题的问题是标题是这样写的,可能没有人会搜索它,在这里回答可能不会带来任何分数:)。

正如评论中提到的,这些是扩展方法。这意味着它们可以扩展一些常规类的功能。关于扩展方法的一些信息:

  1. 它们应该在静态类中声明;
  2. 扩展类应该是文件中的第一个类。(在 C# 中,您可以在一个文件中包含多个类,但扩展类仅在文件中的第一个类才有效);
  3. 扩展函数也应该是静态的,因为在扩展的关键字“this”后面有一个动态成员;
  4. 扩展函数的第一个参数应该以“this”关键字(如上所述)开头,因为它告诉编译器扩展了哪个对象。

在您的情况下:static public void QueryService<T>(this IServiceProvider serviceProvider, out T service) where T : class意味着由于此功能,任何 IServiceProvider 类型对象都将能够具有附加(扩展)功能 QueryService ,它将采用应该是类(而不是结构)的泛型类型,请参见:where T : class

out T service意味着传递的参数不能被初始化(out尽管不需要参数初始化ref)。

用法将是这样的:

CustomServiceType myService; 
IServiceProvider serviceProvider = new TypeWhichImplementsIServiceProvider();
//Now we can use extension function
serviceProvider.QueryService<CustomServiceType>(out myService); 
//After this function myService should be initialized (probably...)

推荐阅读