CSDN广告是越来越多了,所有博客笔记不再更新,新网址 DotNet笔记
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;
}
}
}