导入
扩展方法
学习如何使用扩展方法向现有类型添加新方法,而无需修改其源代码。
1namespace MainProgram; 2 3public class Printer 4{ 5 public string Message { get; set; } 6 7 public Printer(string message) 8 { 9 Message = message; 10 } 11 12 // 我们可以修改此方法或添加另一个方法 13 public void PrintWithDashes() 14 { 15 Console.WriteLine($"###{Message}###"); 16 } 17}
1using MainProgram; 2 3string message = "Hello World"; 4Printer printer = new(message); 5 6printer.PrintWithDashes();
1namespace MainProgram; 2 3// 因为我们无法更改 Printer 类的源代码, 4// 所以创建一个从 Printer 继承的新类 5public class StarPrinter : Printer 6{ 7 public StarPrinter(string message) : base(message) 8 { 9 10 } 11 12 // 在这里我们可以添加额外的功能 13 public void PrintWithStars() 14 { 15 Console.WriteLine($"***{Message}***"); 16 } 17}
1using MainProgram; 2 3string message = "Hello World"; 4StarPrinter printer = new(message); 5 6// 我们仍然拥有旧的方法 7printer.PrintWithDashes(); 8 9// 但同时也有了这个新方法 10printer.PrintWithStars();
1namespace Extensions; 2 3// 静态类 4public static class StringExtensionMethods 5{ 6 // 静态方法 7 // 注意 "this" 关键字 8 public static string Reverse(this string stringObject) 9 { 10 char[] charArray = stringObject.ToCharArray(); 11 Array.Reverse(charArray); 12 return new string(charArray); 13 } 14}
如果在类型上定义了与现有实例方法同名且签名相同的方法,那么实例方法始终具有优先权。扩展方法将被“隐藏”,永远不会被调用。
1using Extensions; 2 3string name = "John Doe"; 4string company = "PageFlux"; 5 6// 直接在字符串对象上调用该方法 7// 就好像该方法是定义在字符串类内部一样 8Console.WriteLine(name.Reverse()); 9Console.WriteLine(company.Reverse());
1namespace MainProgram; 2 3// 密封类不能被继承 4public sealed class Person 5{ 6 public string FirstName { get; set; } 7 public string LastName { get; set; } 8 public int Age { get; set; } 9 public string Occupation { get; set; } 10 public decimal AnnualSalary { get; set; } 11}
1using MainProgram; 2 3namespace Extensions; 4 5public static class PersonExtensionMethods 6{ 7 public static decimal GetMonthlySalary(this Person person) 8 { 9 return person.AnnualSalary / 12; 10 } 11}
1using Extensions; 2using MainProgram; 3 4Person person = new() 5{ 6 FirstName = "John", 7 LastName = "Doe", 8 Age = 34, 9 Occupation = "Software Developer", 10 AnnualSalary = 120000m 11}; 12 13Console.WriteLine($"Hello, my name is {person.FirstName}."); 14Console.WriteLine($"I work as a {person.Occupation}."); 15Console.WriteLine($"I earn {person.GetMonthlySalary()} dollars per month.");