【转】C# / Extension 扩展方法
扩展方法简介
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。 对于用 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 扩展方法的更多相关文章
- Flutter——Dart Extension扩展方法的使用
dart的extension方法可以给已经存在的类添加新的函数,通过extension我们可以封装一些常用方法,提高开发效率. 例一:扩展String 给string添加一个log打印方法 exten ...
- [C#] Extension Method 扩展方法
当我们引用第三方的DLL.或者Visual Studio自己的库的时候,或许会发现这样的一个情况,如果这个类型有一个XX的方法就好了.这时候我们可以用到扩展方法,是我们的代码更加灵活和高效. 这里我举 ...
- C# -- 扩展方法的应用(Extension Methods)
当你有下面这样一个需求的时候,扩展方法就会起到作用:在项目中,类A需要添加功能,我们想到的就是在类A中添加公共方法,这个显而易见肯定可以,但是由于某种原因,你不能修改类A本身的代码,但是确实又需要增加 ...
- C# Note21: 扩展方法(Extension Method)及其应用
前言 今天在开会时提到的一个概念,入职3个多月多注重在项目中使用C#的编程知识,一直没有很认真地过一遍C#的全部语法,当我们新人被问及是否了解Extension Method时,一时之间竟不能很通俗准 ...
- [译文]c#扩展方法(Extension Method In C#)
原文链接: https://www.codeproject.com/Tips/709310/Extension-Method-In-Csharp 介绍 扩展方法是C# 3.0引入的新特性.扩展方法使你 ...
- (转)C# -- 扩展方法的应用(Extension Methods)
本文转载自:http://blog.csdn.net/zxz414644665/article/details/9793205 当你有下面这样一个需求的时候,扩展方法就会起到作用:在项目中,类A需要添 ...
- Extension Methods(扩展方法)
在 OOPL 中,有静态方法.实例方法和虚方法,如下: public sealed class String { public static bool IsNullOrEmpty(st ...
- [0] C# 扩展方法(Extension Method)
有时有这样的情况,有一个类,你不能修改它,但你又想对它扩展(添加一个方法),这个时候就可以用到扩展方法了.请看下面的例子: using System;using System.Collections. ...
- c#编程指南(五) 扩展方法(Extension Method)
C# 3.0就引入的新特性,扩展方法可以很大的增加你代码的优美度,扩展方法提供你扩展.NET Framewoke类的扩展途径,书写和规则也简单的要命. 编写扩展方法有下面几个要求: 第一:扩展方法所在 ...
随机推荐
- [opencv]利用minAreaRect计算平面矩形的旋转角度
#include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include ...
- 使用 jQuery 实现页面背景色的更换,通过下拉框选择对应的颜色,页面背景会随着选中的颜色进行更换
查看本章节 查看作业目录 需求说明: 使用 jQuery 实现页面背景色的更换,通过下拉框选择对应的颜色,页面背景会随着选中的颜色进行更换 实现思路: 在页面中添加 <select> 标签 ...
- 智慧巨鹿使用Rainbond落地实践,一个平台管理所有应用系统
背景 大家好,我是北京数立通科技有限公司的李栋.最近几年,我一直负责"智慧巨鹿"这一智慧城市项目的运行与维护工作.这个项目涉及到10多家供应商开发的 30 多套智慧城市应用的运维管 ...
- Git 远程分支常用操作
# 查看远程仓库推拉地址,分支信息,分支跟踪情况等 git remote show origin # 拉取远程仓库的变更内容到本地 git fetch origin # 拉取并合并仓库的变更内容到本地 ...
- centos6.5-Apache优化
Apache的网页压缩功能 一.配置网页压缩功能 在配置压缩功能以前访问网页的响应头部 Response Headers view source Accept-Ranges:bytes Connect ...
- python自动化适应多接口的断言怎么做?
最近做的接口自动化,遇到了很多模块的接口,返回的断言不太相同,在放在unnitest单元测试框架+ddt数据驱动,做参数时,发现不能只通过一个方式进行断言,那么,要怎么做才能做到适配当前所有接口的断言 ...
- django中使用支付宝
一.注册 https://auth.alipay.com/login/ant_sso_index.htm?goto=https%3A%2F%2Fopenhome.alipay.com%2Fplatfo ...
- 总结关于spring security 使用 JWT 和 账户密码登录 整合在一起的新感悟
(1)jwt登录拦截,需要在账户密码认证之前进行jwt认证,因此jwt拦截需要在 UsernamePasswordAuthenticationFilter 之前: (2)jwt验证通过则不需要执行账户 ...
- spring security 在controller层 方法级别使用注解 @PreAuthorize("hasRole('ROLE_xxx')")设置权限拦截 ,无权限则返回403
1.前言 以前学习的时候使用权限的拦截,一般都是对路径进行拦截 ,要么用拦截器设置拦截信息,要么是在配置文件内设置拦截信息, spring security 支持使用注解的形式 ,写在方法和接口上拦截 ...
- Jeesite富文本编辑框ckeditor显示错误
Jeesite富文本编辑框ckeditor显示错误 原文链接:https://www.toutiao.com/i6485135618190869005/ Jeesite中Control都会继承一个Ba ...