扩展方法简介
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。 对于用 C#、F# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法没有明显区别。

详见微软官方文档的定义和使用说明:扩展方法(C# 编程指南)

编写方法
定义一个测试用的类,并包含一个成员方法:

public class Module
{
public void Func1()
{
// TODO..
}
}

  

定义一个静态类,编写一个静态方法,用于扩展Module类:

public static class TestExtension
{
public static void Func2(this Module mod)
{
// TODO..
}
}

  

调用测试:

public void Test()
{
var mod = new Module();
mod.Func1();
mod.Func2();
}

  

扩展方法的注意点:
* 需要写在一个静态类中
* 必须是一个静态方法
* 通过第一个参数和this关键字指定扩展的目标类型
* 不同类型的扩展方法不一定要写在同一个类中

如上所示,对Module类进行扩展后,可以和调用原生方法一样,调用扩展方法,在上层使用感受不到区别。通过这种方式,可以很好的对C#原生的类型,和不开源的第三方库,增加额外需求的、符合自己书写习惯的或者有效提高项目开发效率的新接口。

自己项目中实例

1.定义主体

    public class ResChildBase
{
[Key]
[ForeignKey("ResBaseInfo")]
[Column(TypeName = "char(36)")]
public Guid ID { get; set; } public virtual ResBaseInfo ResBaseInfo { get; set; } /// <summary>
/// 多语言的详情描述集合
/// </summary>
[NotMapped]
public List<Description> DescriptionCollection { get; set; } /// <summary>
/// 获取某个语言的详情描述(这种是传统的方式,定义到方法上。但对于类库中的类无法操作)
/// </summary>
/// <param name="lang">多种语言的枚举</param>
/// <returns></returns>
public Description CurDescription(Lang lang) {
return DescriptionCollection.Find(g=>g.Language.Equals(lang));
}
}

  2.书写扩展方式

    public static class EntityExtension
{
/// <summary>
/// 获取指定语言的详情
/// </summary>
/// <param name="list"></param>
/// <param name="lang">枚举类型的语言</param>
/// <returns></returns>
public static Description GetDesc(this List<Description> list, Lang lang)
{
return list.Find(g=>g.Language.Equals(lang));
} /// <summary>
/// 获取指定语言的详情
/// </summary>
/// <param name="list"></param>
/// <param name="lang">字符串类型的语言</param>
/// <returns></returns>
public static Description GetDesc(this List<Description> list, string lang)
{
return list.Find(g => g.Language.ToString().Equals(lang));
}
}

  3.使用

//hotel是继承自ResChildBase的子类
Description des= hotel.CurDescription(Lang.CN); //或者
//在这个View中,Model的类型是继承自ResChildBase的子类
@await Html.PartialAsync("~/Views/Description/_DescriptionDetailView.cshtml", Model.DescriptionCollection.GetDesc("CN"))

  

【转】C# / Extension 扩展方法的更多相关文章

  1. Flutter——Dart Extension扩展方法的使用

    dart的extension方法可以给已经存在的类添加新的函数,通过extension我们可以封装一些常用方法,提高开发效率. 例一:扩展String 给string添加一个log打印方法 exten ...

  2. [C#] Extension Method 扩展方法

    当我们引用第三方的DLL.或者Visual Studio自己的库的时候,或许会发现这样的一个情况,如果这个类型有一个XX的方法就好了.这时候我们可以用到扩展方法,是我们的代码更加灵活和高效. 这里我举 ...

  3. C# -- 扩展方法的应用(Extension Methods)

    当你有下面这样一个需求的时候,扩展方法就会起到作用:在项目中,类A需要添加功能,我们想到的就是在类A中添加公共方法,这个显而易见肯定可以,但是由于某种原因,你不能修改类A本身的代码,但是确实又需要增加 ...

  4. C# Note21: 扩展方法(Extension Method)及其应用

    前言 今天在开会时提到的一个概念,入职3个多月多注重在项目中使用C#的编程知识,一直没有很认真地过一遍C#的全部语法,当我们新人被问及是否了解Extension Method时,一时之间竟不能很通俗准 ...

  5. [译文]c#扩展方法(Extension Method In C#)

    原文链接: https://www.codeproject.com/Tips/709310/Extension-Method-In-Csharp 介绍 扩展方法是C# 3.0引入的新特性.扩展方法使你 ...

  6. (转)C# -- 扩展方法的应用(Extension Methods)

    本文转载自:http://blog.csdn.net/zxz414644665/article/details/9793205 当你有下面这样一个需求的时候,扩展方法就会起到作用:在项目中,类A需要添 ...

  7. Extension Methods(扩展方法)

    在 OOPL 中,有静态方法.实例方法和虚方法,如下:   public sealed class String {      public static bool  IsNullOrEmpty(st ...

  8. [0] C# 扩展方法(Extension Method)

    有时有这样的情况,有一个类,你不能修改它,但你又想对它扩展(添加一个方法),这个时候就可以用到扩展方法了.请看下面的例子: using System;using System.Collections. ...

  9. c#编程指南(五) 扩展方法(Extension Method)

    C# 3.0就引入的新特性,扩展方法可以很大的增加你代码的优美度,扩展方法提供你扩展.NET Framewoke类的扩展途径,书写和规则也简单的要命. 编写扩展方法有下面几个要求: 第一:扩展方法所在 ...

随机推荐

  1. 【机器学*】k*邻算法-02

    k邻*算法具体应用:2-2约会网站配对 心得体会: 1.对所有特征值进行归一化处理:将特征值单位带来的距离影响消除,使所有特征同权重--然后对不同的特征进行加权2.对于相互独立的特征,可以通过建立(特 ...

  2. 第四十八个知识点:TPM的目的和使用方法

    第四十八个知识点:TPM的目的和使用方法 在检查TPM目的之前,值得去尝试理解TPM设计出来的目的是为了克服什么样的问题.真正的问题是信任.信任什么?首先内存和软件运行在电脑上.这些东西能直接的通过操 ...

  3. v75.01 鸿蒙内核源码分析(远程登录篇) | 内核如何接待远方的客人 | 百篇博客分析OpenHarmony源码

    子曰:"不学礼,无以立 ; 不学诗,无以言 " <论语>:季氏篇 百篇博客分析.本篇为: (远程登录篇) | 内核如何接待远方的客人 设备驱动相关篇为: v67.03 ...

  4. JSON.parse 和 JSON.stringify 详解

    JSON格式,(简写JavaScript Object Notation),是一种用于数据交换的文本格式,书写简单. 基于JavaScript原生语法,能够序列化对象.数组.数值.字符串.布尔值和 n ...

  5. CS5266代替AG9311|Type C转HDMI带PD3.0转换芯片|AG9311替代方案

    ALGOLTEK AG9311是一款带PD3.0 Type C转HDMI的转换芯片,它主要用于usb Type-c拓展坞以及多功能usb Type-c转换器等产品设计当中,台湾瑞奇达新推出的CS526 ...

  6. [学习笔记] SpringBoot 之 Helloworld

    创建项目 IDEA / File / New / Project / Spring Initalizr / Next Group: com.wu 公司官网域名反写 Artifact: hellowor ...

  7. 查看磁盘I/O命令iostat详解

    iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视.它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况.iostat也有一个弱 ...

  8. vue重置data

    Object.assign(this.$data, this.$options.data()) 解析:1.Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象. ...

  9. Source Insight 4安装图文教程(附链接)

    Source Insight 4安装图文教程,附激活文件直链 下载链接:http://naturalporters.vicp.io/uploads/si4_kgen_unis.zip 直链没了,就用下 ...

  10. IDEA超级好用的插件推荐

    IDEA超级好用的插件推荐 以下都是本人使用idea开发以来,所使用过的插件,强烈推荐,提升代码质量,事半功倍之首选!!! 先介绍下如何安装这些插件:(本人使用idea的版本是2020.2.3) 1. ...