在c#中给对像添加扩展方法_那java有没有办法添加 多谢_C#扩展方法知多少

前言:上篇 序列化效率比拼——谁是最后的赢家Newtonsoft.Json 介绍了下序列化方面的知识。看过Demo的朋友可能注意到了里面就用到过泛型的扩展方法,本篇打算总结下C#扩展方法的用法。博主打算分三个层面来介绍这个知识点,分别是:.Net内置对象的扩展方法、一般对象的扩展方法、泛型对象的扩展方法。

什么是扩展方法?回答这个问题之前,先看看我们一般情况下方法的调用。类似这样的通用方法你一定写过:

static void Main(string[] args)

{string strRes = "2013-09-08 14:12:10";var dRes =GetDateTime(strRes);

}//将字符串转换为日期

public static DateTime GetDateTime(stringstrDate)

{returnConvert.ToDateTime(strDate);

}//得到非空的字符串

public static string GetNotNullStr(stringstrRes)

{if (strRes == null)return string.Empty;else

returnstrRes;

}

或者在项目中有一个类似Utils的工具类,里面有多个Helper,例如StringHelper、XmlHelper等等,每个Helper里面有多个static的通用方法,然后调用的时候就是StringHelper.GetNotNullStr("aa");这样。还有一种普通的用法就是new 一个对象,通过对象去调用类里面的非static方法。反正博主刚开始做项目的时候就是这样写的。后来随着工作经验的累积,博主看到了扩展方法的写法,立马就感觉自己原来的写法太Low了。进入正题。

1、.Net内置对象的扩展方法

.Net内部也有很多定义的扩展方法,例如我们Linq常用的Where(x=>x==true)、Select()等等。当你转到定义的时候你很容易看出来:public static IEnumerable Where(this IEnumerable source, Func predicate)。当然我们也可以给.Net对象新增扩展方法,比如我们要给string对象加一个扩展方法(注意这个方法不能和调用的Main方法放在同一个类中):

public static string GetNotNullStr(this stringstrRes)

{if (strRes == null)return string.Empty;else

returnstrRes ;

}

然后在Main方法里面调用:

static void Main(string[] args)

{string strTest = null;var strRes =strTest.GetNotNullStr();

}

简单介绍:public static string GetNotNullStr(this string strRes)其中this string就表示给string对象添加扩展方法。那么在同一个命名空间下面定义的所有的string类型的变量都可以.GetNotNullStr()这样直接调用。strTest.GetNotNullStr();为什么这样调用不用传参数,是因为strTest就是作为参数传入到方法里面的。你可以试试。使用起来就和.Net framework定义的方法一样:

6014b29c1b1a7537de6e14a9e35f9cb8.png

当然除了string,你可以给.Net内置的其他对象加扩展方法,例如给DataGridViewRow的扩展方法:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

//DataGridViewRow的扩展方法,将当前选中行转换为对应的对象

public static T ToObject(this DataGridViewRow item) where T:class{var model = item.DataBoundItem asT;if (model != null)returnmodel;var dr = item.DataBoundItem asSystem.Data.DataRowView;

model= (T)typeof(T).GetConstructor(new System.Type[] { }).Invoke(new object[] { });//反射得到泛型类的实体

PropertyInfo[] pro = typeof(T).GetProperties(BindingFlags.Instance |BindingFlags.Public);

Type type=model.GetType();foreach (PropertyInfo propertyInfo inpro)

{if(Convert.IsDBNull(dr[propertyInfo.Name]))

{continue;

}if (!string.IsNullOrEmpty(Convert.ToString(dr[propertyInfo.Name])))

{var propertytype =propertyInfo.PropertyType;

}

}returnmodel;

}

View Code

这样看上去就像在扩展.Net Framework。有没有感觉有点高大上~

2、一般对象的扩展方法

和Framework内置对象一样,自定义的对象也可以增加扩展方法。直接上示例代码:

public classPerson

{public string Name { set; get; }public int Age { set; get; }

}

//Person的扩展方法,根据年龄判断是否是成年人

public static bool GetBIsChild(thisPerson oPerson)

{if (oPerson.Age >= 18)return false;else

return true;

}

Main方法里面调用:

var oPerson1 = newPerson();

oPerson1.Age= 20;var bIsChild = oPerson1.GetBIsChild();

和string扩展方法类似,就不多做解释了。

3、泛型对象的扩展方法

除了上面两种之外,博主发现其实可以定义一个泛型的扩展方法。那么,是不是所有的类型都可以直接使用这个扩展方法了呢?为了保持程序的严谨,下面的方法可能没有实际意义,当开发中博主觉得可能存在这种场景:

public static classDataContractExtensions

{//测试方法

public static T Test(this T instance) whereT : Test2

{

T Res= default(T);try{

Res.AttrTest=instance.AttrTest.Substring(0,2);//其他复杂逻辑...

}catch{ }returnRes;

}

}public classTest2

{public string AttrTest { set; get; }

}

使用扩展方法有几个值得注意的地方:

(1)扩展方法不能和调用的方法放到同一个类中

(2)第一个参数必须要,并且必须是this,这是扩展方法的标识。如果方法里面还要传入其他参数,可以在后面追加参数

(3)扩展方法所在的类必须是静态类

(4)最好保证扩展方法和调用方法在同一个命名空间下

可能你第一次使用这个会觉得很别扭。你也许会说扩展方法和我以前用的static方法无论从代码实现还是算法效率都差不多嘛,是的!确实差不多,但使用多了之后会发现它确实能帮你省去很多代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值