前端之家收集整理的这篇文章主要介绍了
五、谈扩展方法的理解,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为什么要用扩展方法
在说什么是扩展方法之前我们先来说说为什么要用扩展方法。
首先我们定义一个 类:
DateTime BirthTime { ;
DateTime? DeathTime { ;
}
加入这个类来自第三方的dll引用,且现在我们需要添加一个方法 获取年龄。你可能会想到自己定一个子类继承:
(DeathTime.Value - BirthTime).Days /
(DateTime.Now - BirthTime).Days /
是的,这样可以实现我们的需求。不过实现新增的方法就去继承真的是最合适的吗()? 如果上面定义的密封类呢? Person ,这个时候是不能继承的,我们只能另想办法。
随意写个静态类:
(person.DeathTime.Value - person.BirthTime).Days /
(DateTime.Now - person.BirthTime).Days /
然后调用 ,是的看似不错。可是这和我们说的扩展方法有什么关系呢?下面就是见证奇迹的时候了。

其他的任何地方都不变,唯一变化的是在参数前面加里this关键字。对,是的,仅仅如此它就变成了我们今天要讲的扩展方法。
调用如: age = p.GetAge(); 相比上面的 更简单明了。
这里我们说的是在需要扩展密封类的方法时,我们可以使用到扩展方法。还有一种情况就是,在需要扩展接口的时候时候我们更加需要。比如,需要扩展IList的排序。我们要么写个扩展方法,要么是继承实现接口(方法)。我想你心中已经有了答案选择哪种方式。
扩展方法到底是什么
我们看到上面使用的扩展方法,有没有感觉很神奇。仅仅多添加了一个this关键字就直接可以当成扩展方法使用了。那扩展方法到底是什么东东,看了上面代码好像和静态方法有着说不清道不明的关系。下面我们继续分析:
分别定义一个静态方法和一个扩展方法
(person.DeathTime.Value - person.BirthTime).Days /
(DateTime.Now - person.BirthTime).Days / </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> GetAge(<span style="color: #0000ff;">this</span><span style="color: #000000;"> Person person)
{
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (person.DeathTime.HasValue)
</span><span style="color: #0000ff;">return</span> (person.DeathTime.Value - person.BirthTime).Days / <span style="color: #800080;">365</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">else</span>
<span style="color: #0000ff;">return</span> (DateTime.Now - person.BirthTime).Days / <span style="color: #800080;">365</span><span style="color: #000000;">;
}</span></pre>
分别调用:
p = Person() { BirthTime = DateTime.Parse( age == ExtensionClass.GetAge2(p);
编译后的IL代码:

我们看到反编译成IL之后发现两者并无不同。所以,我理解成(方法本质上就是静态方法,之所以出现扩展方法是C#以另外一种形式表现静态方法而已。只有有何妙用下面会继续讲解)。且
扩展方法可以做些什么
IsNullOrEmpty(
调用:
str = isNull = str.IsNullOrEmpty();
感觉相比期静态方法调用要优雅,更接近我们的自然语言。
DateTime? MyToDateTime( (
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 转double
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="str"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><returns></returns></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">double</span> MyToDouble(<span style="color: #0000ff;">this</span> <span style="color: #0000ff;">string</span><span style="color: #000000;"> str)
{
</span><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">string</span><span style="color: #000000;">.IsNullOrEmpty(str))
</span><span style="color: #0000ff;">return</span> -<span style="color: #800080;">1</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">else</span>
<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">double</span><span style="color: #000000;">.Parse(str);
}
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 转int
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="str"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><returns></returns></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> MyToInt(<span style="color: #0000ff;">this</span> <span style="color: #0000ff;">string</span><span style="color: #000000;"> str)
{
</span><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">string</span><span style="color: #000000;">.IsNullOrEmpty(str))
</span><span style="color: #0000ff;">return</span> -<span style="color: #800080;">1</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">else</span>
<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">int</span><span style="color: #000000;">.Parse(str);
}
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 指示指定的字符串是 null 还是 System.String.Empty 字符串。
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="str"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><returns></returns></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">bool</span> IsNullOrEmpty(<span style="color: #0000ff;">this</span> <span style="color: #0000ff;">string</span><span style="color: #000000;"> str)
{
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">string</span><span style="color: #000000;">.IsNullOrEmpty(str);
}
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 如果字符串为null,则返回空字符串。(否则返回原字符串)
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="str"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><returns></returns></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">string</span> GetValueOrEmpty(<span style="color: #0000ff;">this</span> <span style="color: #0000ff;">string</span><span style="color: #000000;"> str)
{
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (str.IsNullOrEmpty())
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">string</span><span style="color: #000000;">.Empty;
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> str;
}</span></pre>