如何实现和调用自定义扩展方法(C# 编程指南)
本主题将介绍如何为任意 .NET 类型实现自定义扩展方法。 客户端代码可以通过以下方法使用扩展方法,添加包含这些扩展方法的 DLL 的引用,以及添加 using 指令,该指令指定在其中定义扩展方法的命名空间。
定义和调用扩展方法
定义包含扩展方法的静态类。
此类必须对客户端代码可见。 有关可访问性规则的详细信息,请参阅访问修饰符。
将扩展方法实现为静态方法,并且使其可见性至少与所在类的可见性相同。
此方法的第一个参数指定方法所操作的类型;此参数前面必须加上 this 修饰符。
在调用代码中,添加
using
指令,用于指定包含扩展方法类的命名空间。和调用类型的实例方法那样调用这些方法。
请注意,第一个参数并不是由调用代码指定,因为它表示要在其上应用运算符的类型,并且编译器已经知道对象的类型。 你只需通过
n
提供形参 2 的实参。
示例
以下示例实现 CustomExtensions.StringExtension
类中名为 WordCount
的扩展方法。 此方法对 String 类进行操作,该类指定为第一个方法参数。 将 CustomExtensions
命名空间导入应用程序命名空间,并在 Main
方法内部调用此方法。
using System.Linq;
using System.Text;
using System;
namespace CustomExtensions
{
// Extension methods must be defined in a static class.
public static class StringExtension
{
// This is the extension method.
// The first parameter takes the "this" modifier
// and specifies the type for which the method is defined.
public static int WordCount(this string str)
{
return str.Split(new char[] {' ', '.','?'}, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
namespace Extension_Methods_Simple
{
// Import the extension method namespace.
using CustomExtensions;
class Program
{
static void Main(string[] args)
{
string s = "The quick brown fox jumped over the lazy dog.";
// Call the method as if it were an
// instance method on the type. Note that the first
// parameter is not specified by the calling code.
int i = s.WordCount();
System.Console.WriteLine("Word count of s is {0}", i);
}
}
}
.NET 安全性
扩展方法不存在特定的安全漏洞。 始终不会将扩展方法用于模拟类型的现有方法,因为为了支持类型本身定义的实例或静态方法,已解决所有名称冲突。 扩展方法无法访问扩展类中的任何隐私数据。
请参阅
Collaborate with us on GitHub
The source for this content can be found on GitHub, where you can also create and review issues and pull requests. For more information, see our contributor guide.
.NET feedback
The .NET documentation is open source. Provide feedback here.
反馈
提交和查看相关反馈