小例子学习C#扩展方法

扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。 对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。为了更好的理解,我写了一个小程序,希望对初学的朋友有所帮助。

首先我建立了一个控制台用用程序,然后建立了一个名为MyClassLibrary的类库,类库里就写了一个Book类。如下图所示

image

在Book类中,我定义了Id,Title,Price,Publisher四个属性,分别表示书的编号,名称,价格和出版社。同时,还写了一个GetBookInfo方法,用于获取书的信息。

Book类的代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
namespace MyClassLibrary
{
    public class Book
    {
        /// <summary>
        /// 编号
        /// </summary>
        public string Id { get; set; }
 
        /// <summary>
        /// 书名
        /// </summary>
        public string Title { get; set; }
 
        /// <summary>
        /// 价格
        /// </summary>
        public decimal Price { get; set; }
 
        /// <summary>
        /// 出版社
        /// </summary>
        public string Publisher { get; set; }
 
 
        public Book()
            : this(string.Empty, string.Empty, decimal.Zero, string.Empty)
        {
        }
 
        public Book(string id, string title)
            : this(id, title, decimal.Zero, string.Empty)
        {
        }
 
        public Book(string id, string title, decimal price, string publisher)
        {
            this.Id = id;
            this.Title = title;
            this.Price = price;
            this.Publisher = publisher;
        }
 
        /// <summary>
        /// 获取书籍信息
        /// </summary>
        public string GetBookInfo()
        {
            return string.Format("编号:{0} 书名:{1} 价格:{2} 出版社:{3}", Id, Title, Price, Publisher);
        }
    }
}

下面我们在测试程序中实例化一个Book类的对象,在Book类中我们已经定义了一个方法GetBookInfo,通过调用这个方法就可以取得书的信息。但是,正好有一天书店要搞活动,这本书要打五折,我们就要修改书的价格,但是在给定的Book类中并没有提供修改书价格的方法,怎么办呢?对,扩展方法就是一个解决的办法。

我们为Book类写一个修改书价格的扩展方法ModifyPrice。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
public static class BookExtension
{
    /// <summary>
    /// 修改书的价格
    /// </summary>
    /// <param name="book">book对象</param>
    /// <param name="price">价格</param>
    public static void ModifyPrice(this Book book, decimal price)
    {
        book.Price = price;
    }
}

测试程序代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Program
   {
       static void Main(string[] args)
       {
           //Book book = new Book("20110711", "红楼梦", 79.00m, "北京出版社");
           Book book = new Book { Id = "20110711", Title = "红楼梦", Price = 79.00m, Publisher = "北京出版社" };
           Console.WriteLine("书籍信息:");
           Console.WriteLine(book.GetBookInfo());
           Console.WriteLine("今天搞活动,本书打五折");
           book.ModifyPrice(book.Price * 0.5m);
           Console.WriteLine(book.GetBookInfo());
       }
   }

程序运行结果如下图所示

image

这个例子并没有什么意义,简单理解,扩展方法就是向已有的类型中添加新的方法。

posted @   BobTian  阅读(654)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示