C#语言一直以其强大的功能和灵活性著称,其中扩展方法为开发者提供了一种便捷的方式来扩展现有类型。然而,扩展方法也有一些局限性,比如只能使用静态类、只能扩展方法。令人振奋的是,即将到来的C# 13可能会带来一次革命性的更新,解决这些限制,让开发者可以更自由地扩展实例成员、静态成员、属性成员和方法成员。

(图片来源网络,侵删)
扩展方法的局限性
在C# 13之前,我们只能通过静态类和静态方法来实现扩展方法。例如,以下代码展示了如何为Person类扩展一个获取年龄的方法:
var person = new Person(); var age = person.GetAge(); // 为Person类扩展一个获取年龄的方法 // 扩展类必须是静态类,扩展方法必须是静态方法 public static class PersonExtension { public static int GetAge(this Person person) { return DateTime.Today.Year - person.DateOfBirth.Year; } } // 示例类 public class Person { public string Name { get; set; } public DateTime DateOfBirth { get; set; } }
虽然这种方式已经很方便,但扩展方法的限制显而易见:我们无法扩展属性,无法直接扩展实例成员,必须通过静态方法来实现。

(图片来源网络,侵删)
C# 13的新扩展功能
即将到来的C# 13将引入一个期待已久的新特性,不再局限于扩展方法,而是可以随意扩展实例成员、静态成员、属性成员和方法成员。这个新特性将极大地改变我们使用扩展的方式,使得代码更加简洁和灵活。以下是使用新特性的示例:
var person = new Person(); var age1 = person.GetAge(); // 调用扩展方法 var age2 = person.Age; // 调用扩展属性 // 新的关键词,implicit extension,隐式扩展 // 类不是静态的,所以它可以任意扩展静态成员或者实例成员,包括属性和方法 // 通过this,访问当前实例对象 public implicit extension PersonExtension for Person { // 扩展实例方法 public int GetAge() { return DateTime.Today.Year - this.DateOfBirth.Year; } // 扩展实例属性 public int Age => DateTime.Today.Year - this.DateOfBirth.Year; }
有了这个新特性,我们不仅可以扩展方法,还可以扩展属性,使得代码更具可读性和可维护性。
显式扩展和多态投影
既然有隐式扩展,自然会存在显式扩展。显式扩展的具体应用我还是不太清晰,但看案例,似乎是可以用于扩展子类或创建多态投影。以下是一个示例:
var person = new Person(); var age = person.Age; if (age >= 18) { Adult adult = person; // 多态转换 var like = adult.LikeSport; // 调用子类?投影?的属性 } // 显式扩展一个子类?投影? public explicit extension Male for Person { public string LikeSport => "football"; }
通过显式扩展,我们可以在需要的时候进行多态转换,进一步增强了代码的灵活性和可扩展性。
展望
C#13带来的新扩展特性,绝对是近几版更新特性的头排,也是被期待已久的功能。随着这一特性的引入,许多C#相关的框架也将变得更加简洁和灵活。希望,不要鸽了。