委托和事件示例

C#中委托和事件的例子比较多,讲得好的非常好,就不瞎凑热闹了,推荐博客园大牛的一篇: C# 中的委托和事件 ,如果你已经有了相应的基础,但没写过相关的例子,那我这里提供一个,首先看一下规范 .Net Framework的编码规范: 委托类型的名称都应该以EventHandler结束。 委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型,一个 EventArgs类型(或继承自EventArgs)。 事件的命名为 委托去掉 EventHandler之后剩余的部分。 继承自EventArgs的类型应该以EventArgs结尾。 然后描述一下流程: 老板监视时间变动(ComputerOffWorkTime方法),当工作时间满50后,通知员工时间到(OnNotifyOffWork方法,并传递OffWorkEventArgs参数),可以下班了,(OnNotifyOffWork方法内部调用事件NotifyOffWork),正式员工收到通知后,则下班,其他员工则清扫一下办公室 然后给出例子: using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; namespace DelegateAndEvent { public class Boss { //表示工作时间 private int virTime; //下班时老板说的话 public String SaidWords { get { return "Boss:时间到,下班了"; } } //委托定义 public delegate void NotifyOffWorkEventHandler(Object sender, OffWorkEventArgs e); //事件 public event NotifyOffWorkEventHandler NotifyOffWork; //事件参数 public class OffWorkEventArgs:EventArgs { public readonly int virTime; public OffWorkEventArgs(int virTime) { this.virTime = virTime; } } //触发事件 protected void OnNotifyOffWork(OffWorkEventArgs e) { if (NotifyOffWork!=null) { NotifyOffWork(this, e); } } //执行操作 public void ComputerOffWorkTime() { for (int i = 1; i <= 50; i++) { virTime = i; if (i>=50) { OffWorkEventArgs e = new OffWorkEventArgs(i); OnNotifyOffWork(e); } } } } //正式员工 public class FormalEmployee { public static void GoHome(Object sender, Boss.OffWorkEventArgs e) { Boss boss = (Boss) sender; Console.WriteLine(boss.SaidWords); Console.WriteLine(e.virTime); Console.WriteLine("FormalEmployee:准备回家"); } } //其他员工 public class OtherEmployee { public static void CleanOffice(Object sender, Boss.OffWorkEventArgs e) { Boss boss = (Boss)sender; Console.WriteLine(boss.SaidWords); Console.WriteLine(e.virTime); Console.WriteLine("OtherEmployee:准备清扫办公室"); } } public class Program { static void Main(string[] args) { Boss boss=new Boss(); //注册事件 boss.NotifyOffWork += FormalEmployee.GoHome; boss.NotifyOffWork += OtherEmployee.CleanOffice; //老板开始计时 boss.ComputerOffWorkTime(); } } }

2013-06-25 · 1 min · bystander

DMP版本修改工具(C#)

最近在使用oracle导入一个dmp文件的时候,由于不知道dmp文件是如何导出的,是使用exp还是expdp导出的,所以纠结了比较长的时间,最后想到是否可以查看dmp文件的一些辅助信息呢,于是有了这个工具。 在使用dmp导入的时候报如下错误 IMP-00010: 不是有效的导出文件,标题验证失败 IMP-00000: 未成功终止导入 据说有两个可能,1个是文件本身损坏,另一个是版本问题,多出现在高版本导出的数据向低版本导入。解决方法就是修改一下dmp文件就行了。dmp文件头部大概9个字节处标识了版本号用来头部验证。对于非常大的dmp我们不能直接用文本编辑器打开,因此找找资料,写个工具。本机一个12GB的文件已测试。 工具使用很简单,选择文件,识别出来版本,按格式改成导入端oracle的版本值,然后即可正常导入11G-10G测试成功。 下载地址:DMP版本修改工具

2013-06-11 · 1 min · bystander

[译]反射(Reflection)和动态(dynamic)

反射 当我们需要检查,调用一个程序集的内容的时候,用反射,比如,当VS给智能提示的时候,就应用了反射。 简单用法实例: var myAssembly = Assembly.LoadFile(@"C:\ClassLibrary1.dll"); var myType = myAssembly.GetType("ClassLibrary1.Class1"); dynamic objMyClass = Activator.CreateInstance(myType); // 获取类的类型信息 Type parameterType = objMyClass.GetType(); // 浏览方法 foreach (MemberInfo objMemberInfo in parameterType.GetMembers()) {Console.WriteLine(objMemberInfo.Name);} // 浏览属性. foreach (PropertyInfo objPropertyInfo in parameterType.GetProperties()) {Console.WriteLine(objPropertyInfo.Name);} //开始调用 parameterType.InvokeMember(“Display”,BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Instance,null, objMyClass, null); 实际一点的用处呢: 1.当你也要开发一个类似VS的编辑器的时候,要提供智能提示就需要反射 2.当创建单元测试框架的时候,为了测试需要动态调用方法和属性的时候 3.有时候我们想把类型的属性,方法等全部导出的时候 动态dynamic 编程语言分为强/弱类型,dynamic是弱类型,此关键字会让编译器不做编译时的类型检查,只做运行时的检查。 简单用法示例: dynamic x = "c#"; x++; 所以上面这行代码可以编译通过,但会产生运行时一场。 实际用处: 最多的就是通过互操作来操作Office组件的时候了 没有dynamic的时候 / Before the introduction of dynamic. Application excelApplication = new Application(); ((Excel.Range)excelApp.Cells[1, 1]).Value2 = "Name"; Excel.Range range2008 = (Excel.Range)excelApp.Cells[1, 1]; 有了dynamic之后世界就不一样了 dynamic excelApp = new Application(); excelApp.Cells[1, 1].Value = "Name"; Excel.Range range2010 = excelApp.Cells[1, 1]; 两者的区别和联系呢 1.当我们想要在运行时操作一个对象的时候,就会用到这两个 2.反射可以用来检测对象的元数据,也能在运行时调用对象的方法和属性 3.dynamic是.net 4.0新出的关键字,知道方法被调用的时候,编译器才会晓得这个方法到底有还是没有。 4.dynamic内部是使用反射来实现的,它缓存了方法调用来提高性能 5.反射可以调用公有和私有成员,而dynamic智能调用用公有成员 6.dynamic是实例相关的,无法访问静态成员,这种情况下使用反射吧。 **Reflection** **Dynamic** **Inspect (meta-data) ** Yes No **Invoke public members** Yes Yes **Invoke private members** Yes No **Caching** No Yes **Static class ** Yes No 再来一张图... [![](/images/d0e1ec824f1199a847d9a16237673a4a299e0dce.jpg)](http://leaverimage.b0.upaiyun.com/36512_o.jpg) 译自:[http://www.codeproject.com/Articles/593881/What-is-the-difference-between?utm_source=feedly](http://www.codeproject.com/Articles/593881/What-is-the-difference-between?utm_source=feedly)

2013-05-27 · 1 min · bystander

武汉大学论文参考文献格式生成工具(C#)

每次写论文报告什么的,最头疼的就是参考文献的,本来打算写一个论文格式生成工具的,不过,一想起代码量,就有点吓人,所以分而治之,先写参考文献生成工具. 本工具生成的文献格式符合武汉大学本科生论文的格式要求,因此,放心使用,填写内容都是必填,页码什么的要是不知道就随便填一个..你懂的..有问题请留言反馈。 程序提供8种参考文献类型,第9种电子文献,没有实现,因为感觉在论文中参考文献要是网址的话很难看.而且用的不多..其实主要还是懒..每种文献类型需要填写的信息都不一样,8种…8种… 使用方法: 1.在界面右侧选择参考文献类型,然后填写。添加,左侧将会出现 2.如果填写错误,双击左侧条目,即可删除 3.完成后导出,即可在本目录生成docx文档 下载地址:武汉大学论文参考文献格式生成工具

2013-05-24 · 1 min · bystander

[已失效]Csdn免积分下载器

作者:bystander 转载请注明来源:http://leaver.me 原理很简单,目前好像还没有大规模传开,我就不透露了,大家低调使用.为了方便,我写了个客户端,下载地址在文章末尾 使用方法直接把你想下载的地址复制过去,点击下载就会调用ie来下载了. 文章太短了,发两个可乐的吧: 第一个是: "网上发言,请不要随便自称笔者,毕竟有没有在用笔在写一目了然。这个词汇已经要汇入历史长河了,虽然曾经的那么疯狂存在过,但至少在互联网上该消失了。" "那以后自称什么?" "键人。" ---------------------------------------------------------------------------------------------------------- 第二个: ---光棍君:五一快到了,你还是一个人吗? ---你MB,难道我会变成狗吗? ---------------------------------------------------------------------------------------------------------- 第一个冷笑话,第二个是热笑话,冷暖自知。一个成语瞬间提升了整篇文章的境界。 下载地址:[Csdn下载器](http://pan.baidu.com/share/link?shareid=468747&uk=1493685990)

2013-05-01 · 1 min · bystander

[E].Net 多线程指南

这是codeproject上的一个系列。我看完了。收获匪浅。可惜作者之后未能更新预想中的总结贴,多少有些可惜,不过。此系列非常非常不错。建议想学习.net多线程的看看。 1.net 多线程介绍 Introduction into threading in .NET 2.线程周期/线程优势/陷阱 Lifecycle of threads/Threading opportunities/Traps 3.线程同步 Synchronization 4.线程池 Thread Pools 5.UI中的线程应用 Threading in UIs (WinForms / WPF / Silverlight)

2013-03-06 · 1 min · bystander

C#中的Debug类

位于命名空间System.Diagnostics中 1.Debug.Print方法 Debug.Print("Today: {0}", DateTime.Today); 2.Debug.WriteLine方法 Debug.WriteLine("Have a nice day"); 3.TraceListener类 DelimitedListTraceListener创建的时候指定一个文件名,当Flush调用的时候,就被覆写到文件里。 TraceListener listener = new DelimitedListTraceListener(@"C:\debugfile.txt"); // Add listener. Debug.Listeners.Add(listener); // Write and flush. Debug.WriteLine("Welcome"); Debug.Flush(); 4.Debug.Write和WriteIf以及WriteLineIf方法 Debug.WriteLineIf(IsThursday(), "Thursday"); 第一个参数一个bool值,为真则输出。 5.Debug.Assert方法 Debug.Assert(value != -1, "Value must never be -1."); 如果表达式为false,则输出。

2013-03-01 · 1 min · bystander

C#反射实现简单的插件系统

如果用过一些优秀的开源或是非开源的应用软件,就会发现这些软件的一个很大的优势就是其开放性,任何有能力的人都可以为其开发不同的插件来增强其的功能。比如著名的foobar2000,Vim和TotalCommander等等。 C#的反射可以用来实现一个简单的插件系统。思路很简单,我们创建一个解决方案,包含三个工程,一个为我们的软件MyApplication,一个为插件接口IPlugin,一个为具体的插件MyPlugin。插件系统的基本思路是我们用一个接口类库,来定义我们软件可以使用的插件必须实现的方法签名。然后我们的软件MyApplication通过引用该IPlugin dll来动态调用,而具体的实现插件MyPlugin则引用该接口来实现具体的方法。这样我们的应用程序就能在不知道具体插件的情况下调用插件了。。 结构图如下: 关键代码也就是通过对程序集载入。搜索到对应接口的实现类。然后调用即可。 Assembly a = Assembly.LoadFrom(AssemblyName); foreach (Type t in a.GetTypes()) { if (t.GetInterface("IMyFunction") != null) { try { IMyFunction pluginclass = Activator.CreateInstance(t) as IMyFunction; pluginclass.doSomething(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } } 运行结果: 源码下载:PluginSystem.zip

2013-02-21 · 1 min · bystander

C#多线程揭秘

文章略长。。。 Demo下载:Demo.Threading.zip 介绍 本文将通过一些例子来展示.net 中如何实现多线程,涉及到以下四部分。 1 .线程概念 2 .如何实现多线程 3 .如何确保线程安全 4 .死锁 什么是进程 一个进程就是一个可执行文件运行的操作系统上下文环境。它被用来分隔虚拟地址空间,线程,对象句柄(指向类似文件这样的资源的指针),以及环境变量,进程还有一些类似优先级类和最大内存分配的属性。 也就是说: 1 .一个进程就是一个包含资源的内存块。 2 .操作系统执行的一个单独的任务。 3 .一个正在运行的软件 4 .一个进程拥有一个/多个操作系统线程 一般的。一个进程最大可以是4GB的内存空间,这块内存是安全,私有,其他进程是无法访问的。 什么是线程 一个线程就是在一个进程里执行的一条指令流,所有的线程都在一个进程里执行,也就是一个进程可以包含多个线程。线程公用进程的虚拟地址空间。线程是操作系统的调度单元。一个线程的上下文由操作系统进行保存/恢复。 也就是说: 1 .一个线程是进程里的一条指令流。 2 .所有的线程在进程里。一个进程可以有多个线程 3 .一个进程的所有线程使用进程的虚拟地址空间。 什么是多线程 多线程指的是进程同时有多个线程活动。这可以通过时间片的线程模拟或是多cpu上的超线程来实现。可以提高性能。 多线程-为什么或是为什么不? 为什么多线程 1 .保持UI响应。 2 .提高性能(对于cpu密集型和I/O密集型的进程) 为什么不多线程 1 .过度使用降低性能 2 .代码复杂,增加设计时间,潜在的bug 线程池 线程池为你的程序提供了一个由操作系统管理的机制。在线程池里的都是后台线程。一个线程池线程在程序的前台线程都退出后,也会推出。每个进程一个线程池。默认情况下。每个处理器会为进程分配25个线程。但是可以通过SetMaxThreads 方法来改变。 .net 中的线程 在.net 中,线程可以通过下面6个方法来实现。 1 .Thread线程类 2 .Delegates委托 3 .Background Worker 4 .ThreadPool 线程池 5 .Task任务类 6 .Parallel并行类 下面的几部分里。我将逐一展示实现方法。 简而言之,多线程就是通过使程序同时运行多个任务来最大化计算机能力,同时能够保持UI响应。下图是一个例子的图示。 代码 提供的源码是一个简单的WinForm程序。模拟了.net中委托,线程类和Background Worker三种方法。 程序异步执行一个繁重的操作,这样UI就不会无响应。三个方法都是模拟的。 这个“繁重”的操作 真实的开发中,这个繁重的操作从轮询数据库到流媒体操作都可以。基本上可以是任何事情。源码里面是向一个字符串追加值。String是不能变的。追加的时候,新的字符串变量会被创建,旧的会被丢弃,这是由CLR处理的。如果做很多次这个操作,是很耗资源的。这也是为什么我们使用Stringbuilder.Append 来代替这个操作。通过调整界面中的次数。可以通知追加的次数。 后面我们有一个Utility泪,有一个LoadData() 方法。类里面也有一个和LoadData() 有着同样签名的委托 class Utility { public delegate string delLoadData(int number); public static delLoadData dLoadData; public Utility() { } public static string LoadData(int max) { string str = string.Empty; for (int i = 0; i < max; i++) { str += i.ToString(); } return str; } } 同步调用 当点击Get Data Sync按钮的时候。操作和UI在同一个线程里,因此阻塞了UI线程。因此。UI线程会未响应 private void btnSync_Click(object sender, EventArgs e) { this.Cursor = Cursors.WaitCursor; this.txtContents.Text = Utility.LoadData(upCount); this.Cursor = Cursors.Default; } 异步调用 使用委托(异步编程模型) ...

2013-02-12 · 7 min · bystander

利用反射转换对象list到csv

扒自一工程。。可以学习一下.net中反射的简单用法 /// <summary> /// Take object List as input and export to csv which will be prompt save as dialog /// </summary> /// <typeparam name="T"> Type of object</typeparam> /// <param name="listToExport"> Object list to export</param> /// <param name="seperateChar"> character to use as scv separator</param> public static string ExportListToCSV<T>( List<T> listToExport, string seperateChar) { Int32 success = 0; StringBuilder export = new StringBuilder(); try { string seperator = "" ; StringBuilder builder = new StringBuilder(); //获取表头的 PropertyInfo[] fieldInfo = listToExport[0].GetType().GetProperties(); foreach (PropertyInfo col in fieldInfo) { if (!col.PropertyType.FullName.Equals("System.Data.EntityKey") && !col.PropertyType.FullName.Equals("System.Data.EntityState" )) { builder.Append(seperator).Append(col.Name); seperator = seperateChar; } } export.AppendLine(builder.ToString()); foreach (T dataItem in listToExport) { PropertyInfo[] allProperties = dataItem.GetType().GetProperties(); seperator = ""; StringBuilder builderTmp = new StringBuilder(); //真正求数据域的 foreach (PropertyInfo thisProperty in allProperties) { if (!thisProperty.PropertyType.FullName.Equals("System.Data.EntityKey") && !thisProperty.PropertyType.FullName.Equals("System.Data.EntityState" )) { object value = thisProperty.GetValue(dataItem, null); String propetyValue = (value == null ? String.Empty : value.ToString()); builderTmp.Append(seperator).Append(propetyValue); seperator = seperateChar; } } ++success; export.AppendLine(builderTmp.ToString()); } } catch (Exception ex) { throw ex; } return export.ToString(); } if (!thisProperty.PropertyType.FullName.Equals("System.Data.EntityKey") && !thisProperty.PropertyType.FullName.Equals("System.Data.EntityState")) ...

2013-02-02 · 1 min · bystander