c# - 有人能解释一下这个语法吗: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# 中,您可以在一个文件中包含多个类,但扩展类仅在文件中的第一个类才有效);
- 扩展函数也应该是静态的,因为在扩展的关键字“this”后面有一个动态成员;
- 扩展函数的第一个参数应该以“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...)
推荐阅读
- javascript - 正在显示 HTML 图像文本而不是图像
- apache-spark - 在 spark-submit 上获取多条消息“寻求最早并重置分区主题分区的偏移量”
- html - 如何修复文本不对齐?
- html - 将查看区域之间的图像与左右文本对齐
- python - 为什么使用函数 scipy.stats.median_absolute_deviation 计算的 MAD 与我所做的函数不同?
- r - 如何使用 Reticulate 在 R shiny App 中导入 Python 函数以供下载 App
- amazon-dynamodb - 在 DynamoDB 中创建 Web 流量日志的最佳方法是什么?
- javascript - 在 Next JS 中更新路由器查询而不触发页面更改事件
- html - 如何为循环折叠的 div 设置不同的值
- ansible - 警告:Ansible 评估裸变量。我该如何正确实施?