利用Lambda表达式、扩展方法以及泛型来为对象添加方法
2011-01-07 13:19
537 查看
问题1:
请考虑上面的代码,可以看到我们写了这么多行代码,其实只是完成了一件很简单的事,那就是在一个单独的线程中执行dispatch.Start()方法;那么有没有更好的方法呢,可不可以像下面这样只用一行就完成这个功能呢?
问题1解决方案:
如果我们利用Lambda表达式、扩展方法以及泛型来为对象添加一个方法就可以解决这个问题,具体代码如下:
不过在这里我们没有考虑线程异常的处理。
问题2:
对于上面的代码我们能不能不用Foreach而是直接对整个Enumerable对象执行一个方法呢?就下下面这样:
问题2解决方案:
问题3:
对于上面的s_ObjectCachePools对象,每次操作都要使用lock (s_ObjectCachePools)语句,我们能不能有另一种写法呢?就像下面这样:
问题3解决方案:
总的解决方案
public void AsycStartDispatcher(Dispatcher dispatcher) { var thread = new Thread( (input) => { var dispatch = input as Dispatcher; if (dispatch != null) dispatch.Start(); }); thread.Start(dispatcher); }
请考虑上面的代码,可以看到我们写了这么多行代码,其实只是完成了一件很简单的事,那就是在一个单独的线程中执行dispatch.Start()方法;那么有没有更好的方法呢,可不可以像下面这样只用一行就完成这个功能呢?
public void AsycStartDispatcher(Dispatcher dispatcher) { dispatcher.AsycExec(obj => obj.Start()); }
问题1解决方案:
如果我们利用Lambda表达式、扩展方法以及泛型来为对象添加一个方法就可以解决这个问题,具体代码如下:
public static class ObjectExtensions { public static void AsycExec<T>(this T obj, Action<T> action) { action.BeginInvoke(obj, null, null); } }
不过在这里我们没有考虑线程异常的处理。
问题2:
public void StartAllDispatcher(IEnumerable<Dispatcher> dispatchers) { foreach (var dispatcher in dispatchers) { dispatcher.Start(); } } public void AsycStartAllDispatcher(IEnumerable<Dispatcher> dispatchers) { foreach (var dispatcher in dispatchers) { var thread = new Thread( (input) => { var dispatch = input as Dispatcher; if (dispatch != null) dispatch.Start(); }); thread.Start(dispatcher); } }
对于上面的代码我们能不能不用Foreach而是直接对整个Enumerable对象执行一个方法呢?就下下面这样:
public void TestForeach(IEnumerable<Dispatcher> dispatchers) { dispatchers.ExecEach(obj => obj.Start()); dispatchers.AsycExecEach(obj => obj.Start()); }
问题2解决方案:
public static class ObjectExtensions { public static void ExecEach<T>(this IEnumerable<T> objs, Action<T> action) { foreach (var obj in objs) { action(obj); } } public static void AsycExecEach<T>(this IEnumerable<T> objs, Action<T> action) { foreach (var obj in objs) { action.BeginInvoke(obj, null, null); } } }
问题3:
lock (s_ObjectCachePools) { if (!s_ObjectCachePools.ContainsKey(poolName)) { s_ObjectCachePools.Add(poolName, new List<Object>()); } s_ObjectCachePools[poolName].Add(result); }
对于上面的s_ObjectCachePools对象,每次操作都要使用lock (s_ObjectCachePools)语句,我们能不能有另一种写法呢?就像下面这样:
s_ObjectCachePools.LockExec(objs => { if (!objs.ContainsKey(poolName)) { objs.Add(poolName, new List<Object>()); } objs[poolName].Add(result); });
问题3解决方案:
public static class ObjectExtensions { public static void LockExec<T>(this T obj, Action<T> action) where T : class { lock (obj) { action(obj); } } }
总的解决方案
public static class ObjectExtensions { public static void Exec<T>(this T obj, Action<T> action) { action(obj); } public static void AsycExec<T>(this T obj, Action<T> action) { action.BeginInvoke(obj,null,null); } public static void ExecEach<T>(this IEnumerable<T> objs, Action<T> action) { foreach (var obj in objs) { action(obj); } } public static void AsycExecEach<T>(this IEnumerable<T> objs, Action<T> action) { foreach (var obj in objs) { action.BeginInvoke(obj,null,null); } } public static void LockExec<T>(this T obj, Action<T> action) where T:class { lock (obj) { action(obj); } } }
相关文章推荐
- 利用Lambda表达式、扩展方法以及泛型来实现一个另类的AOP
- .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解
- 实现一个对象验证库系列 -- 3) Fluent以及扩展方法实现 (请大神批评)
- 匿名函数、委托、lambda表达式、扩展方法
- JavaScript原型和闭包之---为对象添加属性和方法以及in 、delete关键字(一)
- 为LINQ服务的C#新特性总结篇---扩展方法,匿名委托,lambda表达式,Action委托,Func委托,Linq中的order by,top和sum函数
- android中利用java反射原理将对象添加到sqlit数据库的万能方法
- 泛型、函数式接口基础复习以及Lambda表达式、Optional的使用
- DataTable和DataRow利用反射直接转换为Model对象的扩展方法类
- iBatis为业务对象添加可分页方法,扩展方法,调用Oracle
- ajax利用html5新特性带进度条上传文件 html5的FormData对象和input的file属性以及window.URL.createObjectURL( ) 方法
- 匿名函数、委托、lambda表达式、扩展方法
- 每天学习一点.net(5) 利用匿名方法Lambda表达式(=>)实现委托
- 样式表参数和扩展对象的 XsltArgumentList(利用程序编码添加脚本 != 在CDATA下添加)
- 使用扩展方法和接口给对象添加“重置状态”功能
- 扩展 delphi 泛型 以实现类似lambda功能 , C#中的any count first last 等扩展方法
- C#中分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较。
- Quartz动态添加、修改和删除定时任务时间的方法以及日期转换cron表达式时间格式工具类
- 创建一个记录学生成绩的对象,提供一个添加成绩的方法,以及一个显示学生平均成绩的方法。
- Type对象获得泛型类型的两个扩展方法