zoukankan      html  css  js  c++  java
  • 分享.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 = text; 
          }
     }
     

    调用Code Smith模板

    CodeTemplateCompiler compiler = new CodeTemplateCompiler(@"c:\test.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编译的,在运行时,会抛出混合程序集的异常,需要修改配置文件,请参考这个片段

    <?xml version ="1.0"?>
    <configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
    <requiredRuntime safemode="true" imageVersion="v4.0.30319" version="v4.0.30319"/>
    </startup>
    </configuration>

    这个需求源于,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);
    }

    希望可以帮助到你。

  • 相关阅读:
    MongoDB——(转)MongoDB 运维实战总结(转)
    MongoDB——4.4版本因果一致性会话
    架构——(转)用户中心 1亿数据 如何设计(转)
    MongoDB——命令备份
    JavaScript——JavaScript 弹窗
    git rebase
    shell脚本传参选项
    tftp 服务搭建
    gerrit搭建实现代码review
    Robot framework视频和教程分享
  • 原文地址:https://www.cnblogs.com/JamesLi2015/p/2269996.html
Copyright © 2011-2022 走看看