4.net基础之委托事件

委托的声明
public delegate void NoReturnNoPara();
访问修饰符 delegate关键字 返回值 委托名
委托的调用
NoReturnNoPara nrnp = new NoReturnNoPara(传递方法名);
传递的方法必须满足,没有返回值,没有参数的限制。实例方法,静态方法,虚方法
nrnp.Invoke();

泛型委托
Func:接收0-17个输入参数,一个返回参数的泛型委托
Action:接收0-17个输入参数,0个返回参数的泛型委托

委托的意义:解耦
使用泛型+委托实现 ADO.NET的增删改查,将公共实现部分抽取出来,采用泛型委托的方式将增/删/改/查逻辑分离出去。
做到逻辑的解耦。实现代码

1  public class Company
2     {
3         public int Id { get; set; }
4         public string Name { get; set; }
5         public DateTime CreateTime { get; set; }
6         public int CreatorId { get; set; }
7         public int? LastModifierId { get; set; }
8         public DateTime? LastModifyTime { get; set; }
9     }

Company类

 1     public class DBHelper<T> where T:class,new()
 2     {
 3         private static string connectionStr = ConfigurationManager.ConnectionStrings["connectionStr"].ConnectionString;
 4
 5         private W ExecuteSql<W>(string sql,Func<IDbCommand,W> func) {
 6             using (SqlConnection conn = new SqlConnection(connectionStr))
 7             {
 8                 IDbCommand command = conn.CreateCommand();
 9                 conn.Open();
10                 return func(command);
11             }
12         }
13         public bool Add(T t)
14         {
15             Type type = typeof(T);
16             var c = string.Join(",", type.GetProperties().Where(p => p.Name != "Id").Select(p => string.Format("[{0}]", p.Name)));
17             var v = string.Join(",", type.GetProperties().Where(p => p.Name != "Id").Select(p => string.Format("@{0}", p.Name)));
18             var list = new List<SqlParameter>();
19             foreach (var item in type.GetProperties().Where(p => p.Name != "Id"))
20             {
21                 list.Add(new SqlParameter("@" + item.Name, item.GetValue(t)));
22             }
23             string sql = string.Format("insert into {0} ({1}) values ({2});", type.Name, c, v);
24
25             return ExecuteSql<bool>(sql, cmd =>
26             {
27                 foreach (var item in list)
28                 {
29                     cmd.Parameters.Add(item);
30                 }
31                 cmd.CommandText = sql;
32                 cmd.CommandType = CommandType.Text;
33                 bool isAdded = cmd.ExecuteNonQuery() > 0;
34                 cmd.Connection.Close();
35                 return isAdded;
36             });
37         }
38
39         public bool Delete(int id)
40         {
41             string sql = "DELETE FROM [dbo].[Company] where [email protected]";
42             return ExecuteSql<bool>(sql, cmd =>
43             {
44                 cmd.Parameters.Add(new SqlParameter("@Id", id));
45                 cmd.CommandText = sql;
46                 cmd.CommandType = CommandType.Text;
47                 bool isDeleted = cmd.ExecuteNonQuery()>0;
48                 cmd.Connection.Close();
49                 return isDeleted;
50             });
51         }
52
53         public bool Update(T t) {
54             Type type = typeof(T);
55             var c = string.Join(",", type.GetProperties().Where(p => p.Name != "Id").Select(p => string.Format("[{0}][email protected]{1}", p.Name,p.Name)));
56             var list = new List<SqlParameter>();
57
58             foreach (var item in type.GetProperties())
59             {
60                 list.Add(new SqlParameter("@" + item.Name,item.GetValue(t)));
61             }
62             string sql = string.Format("UPDATE [dbo].[Company] SET {0} where Id = @Id",c);
63             return ExecuteSql<bool>(sql, cmd =>
64             {
65                 foreach (var item in list)
66                 {
67                     cmd.Parameters.Add(item);
68                 }
69                 cmd.CommandText = sql;
70                 cmd.CommandType = CommandType.Text;
71                 bool isUpdated = cmd.ExecuteNonQuery() > 0;
72                 cmd.Connection.Close();
73                 return isUpdated;
74             });
75         }
76         public IList<T> Query() {
77             return null;
78         }
79
80         public IList<T> Query(string where) {
81             return null;
82         }
83     }

使用委托解耦分离逻辑实现ADO.NET_SqlHelper

委托的意义:异步多线程:

委托的意义:多播委托
delegate:System.MulticastDelegate
构成一个委托链条,移除委托中的某一项是从委托链的尾部去查找完全匹配的方法进行移除
多播委托的应用场景:猫叫引发的一系列事件

委托事件:观察者模式
public event Action action;
事件只能外部订阅,内部调用,事件只能出现在+=,-=组合符号的左边。

时间: 2024-10-23 15:57:56

4.net基础之委托事件的相关文章

C# 1的核心基础之一——委托

C# 1的核心基础之一--委托 C# 1的核心基础之一--委托简单委托的构成合并和删除委托事件的简单讨论委托总结 简单委托的构成 声明委托类型: delegate void StringProcessor(string input); 为委托实例的操作找到一个恰当的方法 void PrintString(string x)完全符合要求 void PrintInteger(int x)参数类型不兼容 void PrintTwoStrings(string x, string y)参数个数不匹配 i

C#解惑1——委托&amp;事件(转)

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性. 委托和事件在.NET Framework[1]中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易. 中文名 c#委托 外文名 Delegate 编程语言 C# 作    用 方便的引用被委托的方法 应    用 NET Framework 目录 1引言 2参数

C# 利用委托事件进行窗体间的传值(新手必看)

引言: 窗体间传值是每个学习WinForm新手的常见问题,最初级的方法就是 在窗体中先获取到要接受值窗体.然后通过.得到某个空间或者属性,直接赋值,这个需要接收放的窗体属性或者空间必须是public ,是极不安全的一种方式.在升级一下的新手做法就是在接受窗体中定义一个方法然后通过 调用这个方法来给某个控件或者属性赋值.这两种方法都是非安全的低级方式.非常不建议使用.本文我们讲讲如何通过委托事件(非单纯的委托)来解决窗体间信息传递的问题. 场景: 通过点击主主窗体From_Main的发送按钮,所有

C#委托事件

1.委托事件关键词:delegate 2.在声明函数的时候在函数类型后面加上 例:public delegate int Test(int x,int y) 3.定义委托变量:Test t1,委托接收的是方法引用. 4.委托变量可以当成函数的调用.用赋值“=” 委托变量 = 函数名 5.委托类型的变量,可以引用任何一个满足要求的方法,类似于C语言的函数指针. 6.一个委托变量可以使用“+=”挂接多个方法,也能使用“-=”动态地移除某个方法的引用. 7.引用多个方法的委托变量称为“多路委托”. 8

JavaScript基础—闭包,事件

Js基础-闭包,事件 1:js中的闭包 概念:在一个函数内部又定义了一个函数,内部函数能访问到外部函数作用域范围内的变量,这时这个内部函数就叫做闭包,无论这个内部函数在哪里被调用都能访问到外部函数作用域中的那些变量.这些闭包是通过作用域链来实现的. 闭包可以做什么: 改变变量作用域;js中的面向对象都是用闭包来模拟的. 注意:当代码中有闭包的时候,闭包的代码什么时间执行最重要. Eg:下面的代码相当于C#中的局部变量,外面是访问不到的. <script type="text/javascr

观察者(Observer)模式 * 委托事件

观察者(Observer)模式:定义了一种一对多的依赖关系.让多个观察者对象同时监听某一个主题对象.   这个主题对象发生变化时会通知所有观察者对象,使他们字段更新自己 /* * 抽象主题(Subject)角色:主题角色把所有对观察考对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者. 抽象主题提供一个接口,可以增加和删除观察者对象,主题角色又叫做抽象被观察者(Observable)角色,一般用一个抽象类或者一个接口实现. * 抽象观察者(Observer)角色:为所有的具体观察者定义

ArcGIS Runtime for Android开发教程V2.0(8)基础篇-----地图事件

转自:http://blog.csdn.net/arcgis_mobile/article/details/8263283 ArcGIS Runtime sdk for Android为我们提供了丰富的事件监听器,本节将主要介绍我们经常使用的监听器,并且介绍通过这些监听器可以实现哪些功能,在下面的监听器中只有MapOnTouchListener是类,其他皆为接口类型,如图所示: 1.1 MapOnTouchListener MapOnTouchListener是MapView最为重要的监听器之一

[.net 面向对象编程基础] (21) 委托

[.net 面向对象编程基础] (20)  委托 上节在讲到LINQ的匿名方法中说到了委托,不过比较简单,没了解清楚没关系,这节中会详细说明委托. 1.什么是委托? 学习委托,我想说,学会了就感觉简单的不能再简单了,没学过或都不愿了解的人,看着就头大,其实很简单.委托在.net面向对象编程和学习设计模式中非常重要,是学习.net面向对象编程必须要学会并掌握的. 委托从字面上理解,就是把做一些事情交给别人来帮忙完成.在C#中也可以这样理解,委托就是动态调用方法.这样说明,就很好理解了. 平时我们会

.Net 命名(委托,事件==)

委托及参数命名: public delegate void ClickedEventHandler(object sender, ClickedEventArgs e); ClickedEventHandler Clicked; .Net 命名(委托,事件==),布布扣,bubuko.com