1) 扩展方法: 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
2) 扩展方法的特性
1:必须静态的,但它们是通过实例方法语法进行调用的。即:通过 "目标扩展类" 的事例调用的.
2: 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。
3:仅当您使用using 指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中。 即: 使用之前,必须使用Using导入
3) 场景: HtmlHelper类,我们经常需要自定义一些扩展方法
事例:
- public static MvcHtmlString MyTestExtentFun(this HtmlHelper h)
- {
- string str = "<a>asdasdasdasd</a>";
- MvcHtmlString hs = new MvcHtmlString(str);
- return hs;
- }
- @{
- ViewBag.Title = "主页";
- }
- @using MvcDDL;
- @Html.MyTestExtentFun()
4) 扩展HtmlHelper类 如果页面是强类型的,可以使用lambda表达式传递参数
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Linq.Expressions;
- using System.Text;
- using System.Web;
- using System.Web.Mvc;
- using System.Web.Helpers;
- using System.Web.Mvc.Html;
- namespace MvcDDL
- {
- public static class DdlClass
- {
- public static MvcHtmlString Test<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
- {
- /*
- * 参数1:
- this HtmlHelper<TModel> htmlHelper中的TModel,是存放所有页面数据的(包含:viewbag,viewdata,视图model)载体,其实视图model和viewdata是放一起的
- 此时,如果打断点,可发现,lambda的结果已经计算好了.存放在ViewData里面,我们可以通过元数据,查询拉姆达表达式获取结果值
- *参数2
- Expression<Func<TModel, TProperty>> expression 是拉姆达表达式(匿名函数,委托的变形),TModel是传入的数据类型一般指视图模型(eg: m=>m.id ) TProperty
- 是返回的类型.
- 拉姆达表达式:expression.Body 是箭头左侧的那一段
- MemberExpression 表示访问字段或属性。可以通过其获取字段的名称
- */
- //获取属性的名称
- var exp = expression.Body as MemberExpression;
- string expStr = exp.ToString();//形如 m.name
- string id = expStr.Substring(expStr.IndexOf(".") + 1);
- //获取lambda表达式的的结果值(属性值)
- var value = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model;
- string str = " <select >";
- str += str += "<option>------</option>";
- str += " </select>";
- MvcHtmlString hs = new MvcHtmlString(str);
- return hs;
- }
- }
- }