首页 > 分享.NET开发中经常使用到的代码片段 完全从实际项目中提取出来,也可被反反复复的重复借用...

分享.NET开发中经常使用到的代码片段 完全从实际项目中提取出来,也可被反反复复的重复借用...

几年前,一篇《ASP.NET开发人员经常使用的三十三种代码》非常流行,它总结了一些经常在ASP.NET开发中使用到的代码,直接可以拿来使用。今天重读这篇文章,有感而发,善于总结也是进步,于是我也从我的项目中总结一些常用的代码片段,分享给各位园友。



写文本文件

TextWriter tw = new StreamWriter("date.txt");
tw.WriteLine(DateTime.Now);
tw.Close();



读文本文件

写法一

Textreader tr = new StreamReader("date.txt"); Console.WriteLine(tr.ReadLine()); tr.Close(); 写法二
StreamReader reader = new StreamReader("date.txt");
Console.WriteLine(reader.ReadLine()); 
reader.Close(); 

 

其实,上面的写文本文件和读文本文件,都有一个bug,当程序中有代码改变当前目录时,date.txt的目录就是这个被改变的目录,而不是我们期待的当前应用程序所有的目录。所以,推荐的写法是这样的

string file = "Cnblogs.txt";
string cnblogs = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, file);
if (File.Exists(cnblogs))
{using (StreamReader reader = File.OpenText(cnblogs)){rtfCnblogs.Text = reader.ReadToEnd();}
}

加入了完整的文件名路径,这样才是正确的读写文件的方法。如果是ASP.NET应用程序,可以用Server.MapPath代替,

或是HttpContext.Current.Request.PhysicalApplicationPath。

 

跨线程访问控件

delegate void dSetText(string text);
private void SetText(string text){                
      if (InvokeRequired)      
      {    
          dSetText d = new dSetText(SetText);       
          this.Invoke(d);      
      }  
      else{       
       this.textBox1.Text = ; 
      }}

 

调用Code Smith模板

CodeTemplateCompiler compiler = new CodeTemplateCompiler(@"c:	est.cst");
compiler.Compile(); if (compiler.Errors.Count == 0){
CodeTemplate t = compiler.CreateInstance();
this.txtSql.Text = t.RenderToString();
} 
compiler.Cleanup();
compiler = null;

如果是x64的系统,请设置Target为x86(need to set the program to compile as X86)。

 

设置程序集运行时版本

当旧的程序是以.NET 2.0编译的,又无法升级到.NET 4.0,而有部分组件是以.NET编译的,在运行时,会抛出混合程序集的异常,需要修改配置文件,请参考这个片段

"1.0"?>

"true">
"true" imageVersion="v4.0.30319" version="v4.0.30319"/>

这个需求源于,Code Smith 5.0是以.NET 2.0编译的。在我的代码生成可器中,它用来反射读取程序集信息,生成代码,而这个被读取的程序集的Target是.NET 4.0,这时,你需要这个技巧来解决运行时的问题。

另一个场景是ILMerge,用于合并.NET程序集的工具,只有.NET 2.0的版本,要可以合并.NET 4.0的程序集,也需要运用这个技巧(ILMerge config file for executing within the CLR v4.0 runtime)。

 

枚举类型的反射调用

在有些场景,我们需要把反射的参数值传到对象的方法中,而参数值是enum类型,这实现起来并不简单。

请参考codeproject中这的篇文章《Setting Enum's Through Reflection 》,它的经典代码是这样的

int enumValue1 = (int)enumItem1.GetValue(enumType);
int enumValue2 = (int)enumItem2.GetValue(enumType);
int currentValue = (int)flagsInfo.GetValue(remoteObject, null);
int newValue = currentValue | enumValue1 | enumValue2;

举例说明,我需要反射生成ReportViewer控件的对象实例,并且要传一个Mode值给它(Server,LocalReport)以表示是本地报表,还是取服务器报表。这种情况下,非得用反射的方式传入值。

在我的.NET通用平台中,也应用到这项技术,以反射方式创建CrystalReportViewer报表控件,再传入参数值。这种方式稍微复杂一些,但是对比它带来的灵活性,是非常值得的。

 

目录选择功能

FolderBrowserDialog dlg = new FolderBrowserDialog();
if (!string.IsNullOrEmpty(txtPath.Text))dlg.SelectedPath = txtPath.Text;
if (dlg.ShowDialog() == DialogResult.OK)
{txtPath.Text = dlg.SelectedPath;
}
 

文件选择功能

OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "All File(*.*)|*.*";
if (dlg.ShowDialog() == DialogResult.OK)
{txtPath.Text = dlg.FileName;
}     

Filter是经常容易忘记的选项,再举一个例子

dlg.Filter = "Xml file (*.xml)|*.xml|All Files|*.*";

 

读取嵌入到程序集中的资源文件

Assembly assm = Assembly.GetAssembly(typeof(DatabaseCleanup));
string file = "DatabaseCleanup.txt";
Stream input = assm.GetManifestResourceStream("DataLoader.Resource" + "." + file); 
StreamReader reader=new StreamReader(input);
string sql=reader.ReadToEnd();
reader.Close();
只要可能,对只读的不需要修改的配置选项资源(SQL语句,文本文件),尽可能的使用Embedded Resource方式。

 

微软企业库的调用方式

经过一层简单的封装,以下面的这种方式来调用企业库以访问数据库

EnterpriseLibraryShared.ConnectonString =ConnectionString;
Microsoft.Practices.EnterpriseLibrary.Data.Database m_commonDb = DatabaseFactory.CreateDatabase();
DbCommand cmd = m_commonDb.GetSqlStringCommand(sql);
int rowAffected = m_commonDb.ExecuteNonQuery(cmd);

我把企业库的连接字符串放到一个static class中,这样可以简化调用方式,不必要一定要加App/Web.config文件。

 

监控文件或目录的变化

这个功能比较常用,在Data Loader也有一个PDF Watcher的程序,以监控指定的目录是否有新加入的PDF文件(可能来自远程传输,或是从网页中下载回来),然后对它进转换,导入到文档服务器中。

public void StartMonitor(string path)
{          FileSystemWatcher watcher = new FileSystemWatcher();watcher.Path = path;watcher.NotifyFilter = NotifyFilters.FileName;// Only watch pdf files.watcher.Filter = "*.pdf";watcher.Created += new FileSystemEventHandler(OnChanged);watcher.EnableRaisingEvents = true;
}// Event handler for when a  file is created in the watched folder
private void OnChanged(object source, FileSystemEventArgs e)
{string word = DocumentUtility.ConvertPdfToDoc(e.FullPath);
}

 

希望可以帮助到你。

转载于:https://www.cnblogs.com/JamesLi2015/archive/2011/12/01/2269996.html

更多相关:

  • 最近公司要做一个企业微信的小程序,方便企业内的成员来登录,以便一些公司内的业务,只限于公司内的成员来操作,因为有微信小程序的开发经验,所以先当作微信小程序来开发了!首先来讲一下这个企业微信小程序与微信小程序登录的不同,下面是微信小程序登录的流程:小程序内需要调用wx.login(),获取临时登录凭证code,并回传到开发者服务器,然后...

  • sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个“外部”很关键,因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一个列表,所以才能用[]提取其中的元素。其第一个元素是程序本身,随后才依次是外部给予的参数。下面我们通过一个极简单的test.py程序的运行结果来说...

  •   标题:创意虾-程序纹理Blender大师班 信息: 什么是程序纹理? 程序纹理将简单的数学转换为无限的真实感着色器,具有无限的多样性和分辨率。 超越看起来像一团像素特写的图像纹理,运用程序纹理的力量,清晰的细节和没有重复的模式。 你是不是在玩节点滑块,得到了一些有趣的结果,但不确定引擎盖下到底发生了什么?掌握了节...

  • gprof用于分析函数调用耗时,可用gprof分析最耗时的函数,以便优化程序。 gcc链接时也一定要加-pg参数,以使程序运行结束后生成gmon.out文件,供gprof分析。 gprof默认不支持多线程程序,默认不支持共享库程序。 gcc 编译程序时添加编译选项-pg 运行程序,程序退出时生成 gmon.outgprof ./...

  • 一.虚拟机、linux简介 简单介绍一下虚拟机还有就是各种操作系统,比如centos,Ubuntu 操作系统:linux(centos、Ubuntu、redhat),Android,Windows(xp、win8、win10) 进程,多个程序,分时技术,并行技术 一次打开多个程序,我们在只有一个cpu,如何让这些程序进...

  • 菜鸟一枚,正在学习C++ Gui Qt4,整理很零碎,欢迎批评指正   1.窗口标题: QWidget *window = new QWidget; window->setWindowTitle("Enter Your Age"); **************************************** 关于标题...

  • 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 总体思路是: 比较两个链表头节点,较小的插入新链表指针之后,同时较小链表指针向后移动一位 实现如下: ListNode* mergeTwo...

  • 1.直接调用微软socket对象处理 static void Main(string[] args){try{IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });//在3721端口新建一个TcpListener对象TcpListener listener = new...

  •   现在很多地方都会用到zookeeper, 用到它的地方就是为了实现分布式。用到的场景就是服务注册,比如一个集群服务器,需要知道哪些服务器在线,哪些服务器不在线。   ZK有一个功能,就是创建临时节点,当机器启动应用的时候就会连接到一个ZK节点,然后创建一个临时节点,那么通过获取监听该路径,并且获取该路径下的节点数量就知道有哪些服务...

  • 前台到后台java时data日期类型的转化 在实体类中用@DataTimeFormat,这样设置即使传过来是空的字符串也是可以转的,要和前面传过来的格式一致,如 @XmlElement(name="BeginDate") @DateTimeFormat(pattern="yyyy-MM-dd") private Date begin...

  • 本文来自 运维人生 ,作者:fly是个稻草人链接:http://www.ywadmin.com/?id=76误删除linux系统文件了?不用急,本文将给你一个恢复linux文件的方法,让你轻松应对运维中的各风险问题。方法总比问题多~说在前面的话针对日常维护操作,难免会出现文件误删除的操作。大家熟知linux文件系统不同win有回收...

  • 原文来自SecIN社区—作者:WiHat0x00 什么是WebShell渗透测试工作的一个阶段性目标就是获取目标服务器的操作控制权限,于是WebShell便应运而生。Webshell中的WEB就是web服务,shell就是管理攻击者与操作系统之间的交互。Webshell被称为攻击者通过Web服务器端口对Web服务器有一定的操作权限,而...

  • 断电时文件系统发生了什么?硬盘又发生了什么?下一次开机时写到一半的文件在系统层面还在吗?在底层还在吗?更进一步的, 文件系统如何保证事务性, 会不会存在某种极端情况导致例如最后几个bit还没写完, 文件系统却认为它成功了的情况?回答不限任何文件系统,谢谢!下面是「北极」的回复分享断电的一瞬间,很多事情是无法确定的:1. 你无法确定...

  • 接到项目需求。需要搭建一个页面进行交互,慢慢来b (2).jpg使用python django框架进行页面的搭建在项目文件下打开窗口,输入命令;django-admin startproject helloword#在文件helloword/helloword/创建view.py在view.py文件中输入以代码from django....

  • 常见的错误集合解决方案(一)No.1提示错误'Microsoft.VC90.CRT,version="9.0.21022.8"把Microsoft.NET Framework 3.5.1下面的全部勾选上。No.2解决Qt Designer设计的图标但是VS生成不显示问题描述:在Qt designer中为菜单栏和工具栏设计的图标,但是...