扩展方法简介
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。 对于用 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. Linux环境下Django App部署到XAMPP上

    Django App部署到XAMPP上 准备工作 首先一定要保证自己的代码在本地可以运行! 同时在服务器上把需要的库,什么数据库之类的都装好! 源码安装mod_wsgi 从mod_wsgi的gitgu ...

  2. CS229 机器学习课程复习材料-概率论

    本文是斯坦福大学CS229机器学习课程的基础材料,原始文件下载 原文作者:Arian Maleki , Tom Do 翻译:石振宇 审核和修改制作:黄海广 备注:请关注github的更新. CS229 ...

  3. Java实习生常规技术面试题每日十题Java基础(一)

    目录 1.Java 的 "一次编写,处处运行"如何实现? 2.描述JVM运行原理. 3.为什么Java没有全局变量? 4.说明一下public static void main(S ...

  4. 使用 DML语句针对仓库管理信息系统,进行查询操作

    查看本章节 查看作业目录 需求说明: 查询所有电视机产品的基本信息,要求显示产品编号.产品名和进货单价 查询所有产品的基本信息,要求按类型升序.价格降序显示查询信息 显示所有不重复的产品类型 显示进货 ...

  5. mysql+heartbeat+drbd安装

    环境: 系统           IP地址            主机名             软件包列表 centos6.5  192.168.200.101      server1       ...

  6. 2.HTML5基本标签

    一.标题标签  h1-->h6 h1最大 h6最小   <body>   <h1>一级标题</h1>   <h2>二级标题</h2> ...

  7. oracle 之 数组、嵌套表、SQL查询式 实现多表数据for循环插入指定表

    1.基础环境 创建基础表: CREATE TABLE TEST_TAB1( ID INT, NAME VARCHAR2(20) ); CREATE TABLE TEST_TAB2( ID INT, N ...

  8. vmware快速扩容虚拟磁盘

    在使用vmware进行虚拟化的时候,会遇到虚拟磁盘不够用的情况,以前的办法都是使用lvm进行管理扩容,目前在linux上可以实现快速扩容了,具体方法如下: 该方法参考阿里云在线扩容文档:文档地址 其中 ...

  9. LabVIEW生成.NET的DLL——C#下调用NI数据采集设备功能的一种方法 [原创www.cnblogs.com/helesheng]

    LabVIEW是NI公司的数据采集设备的标准平台,在其上调用NI-DAQmx驱动和接口函数能够高效的开发数据采集和控制程序.但作为一种图形化的开发语言,使用LabVIEW开发涉及算法和流程控制的大型应 ...

  10. 【Java】回形数

    回形数 键盘读入一个整数n(1-20),以n为矩阵大小,把1,2,3,4,5-按顺时针螺旋的形式填入. import java.util.Scanner; public class HuiXingSh ...