艾伟_转载:c#扩展方法奇思妙用变态篇四:string 的翻身革命

 

 string是各种编程语言中最基础的数据类型,长期以来受尽其它类的压迫,经常被肢解(Substring、Split)、蹂躏(Join)...

 而现在string要“翻身闹革命”了,它几乎无所不能,可以为所欲为,令其它类心惊胆颤...

 

 让我们来看一下革命后的string做了些什么?

 1. 打开文件或网址

1      "c:\\t.txt".Open();
2      "http://www.cnblogs.com/ldp615/".Open();

 怎么做到的呢?看扩展,很简单,直接调用调用了Process.Start函数:

1     public static void Open(this string s)
2     {
3         Process.Start(s);
4     }

 单单打开个文件,窃取他人信息只是初步操作,string还可以修改、删除、创建文件(或目录)

 2. 文件及目录操作

1     @"C:\Directory".CreateDirectory();
2     @"C:\Directory\readme.txt".WriteText("this file is created by string!");
3     @"C:\abc.txt".DeleteFile();

 实现同样简单,调用File及Directory类。以下上面三个扩展的实现。(当然还可以实现更多文件及目录操作,很简单,不再给出!)

 1     public static void CreateDirectory(this string path)
 2     {
 3         Directory.CreateDirectory(path);
 4     }
 5     public static void WriteText(this string path, string contents)
 6     {
 7         File.WriteAllText(path, contents);
 8     }        
 9     public static void DeleteFile(this string path)
10     {
11         if(File.Exists(path)) File.Delete(path);
12     }

  还是感觉不过瘾,想要删除整个硬盘的文件,用上面的一个一个来也太麻烦了。也没问题,看下面:

 3. 执行DOS命令,先看两个简单的 

1     string output1 = "del c:\\t1.txt".ExecuteDOS();
2     string output2 = "dir".ExecuteDOS();

 实现也用了Process类,如下:

 1     public static string ExecuteDOS(this string cmd)
 2     {
 3         Process process = new Process();
 4         process.StartInfo.FileName = "cmd.exe";
 5         process.StartInfo.UseShellExecute = false;
 6         process.StartInfo.RedirectStandardInput = true;
 7         process.StartInfo.RedirectStandardOutput = true;
 8         process.StartInfo.RedirectStandardError = true;
 9         process.StartInfo.CreateNoWindow = true;
10         process.Start();
11         process.StandardInput.WriteLine(cmd);
12         process.StandardInput.WriteLine("exit");
13         return process.StandardOutput.ReadToEnd();
14     }

 DOS命令也会有异常发生,下面的实现可通过out参数返回错误信息:

ExecuteDOS
 1     public static string ExecuteDOS(this string cmd, out string error)
 2     {
 3         Process process = new Process();
 4         process.StartInfo.FileName = "cmd.exe";
 5         process.StartInfo.UseShellExecute = false;
 6         process.StartInfo.RedirectStandardInput = true;
 7         process.StartInfo.RedirectStandardOutput = true;
 8         process.StartInfo.RedirectStandardError = true;
 9         process.StartInfo.CreateNoWindow = true;
10         process.Start();
11         process.StandardInput.WriteLine(cmd);
12         process.StandardInput.WriteLine("exit");
13         error = process.StandardError.ReadToEnd();
14         return process.StandardOutput.ReadToEnd();
15     }

 有了这个扩展,格式化硬盘、关机、重启都不在话下!

1     "format c:".ExecuteDOS();
2     "shutdown -s".ExecuteDOS();
3     "shutdown -r".ExecuteDOS();

 以上对付一般用户的电脑足够了,可但对程序员的电脑,他们居然把信息放进了数据库!同样有办法!

 4. 执行SQL

1     DbConnection conn = 
2     int count = "select count(*) from Girlfriends".ExecuteScalar(conn).Cast<int>();

 参考实现如下:  

 1     public static object ExecuteScalar(this string sql, DbConnection conn)
 2     {
 3         object result;
 4         using (DbCommand cmd = conn.CreateCommand())
 5         {
 6             cmd.Connection = conn;
 7             cmd.CommandText = sql;
 8             cmd.CommandType = System.Data.CommandType.Text;
 9             conn.Open();
10             result = cmd.ExecuteScalar();
11             conn.Close();
12         }
13         return result;
14     }

 还有Cast扩展:

1     public static T Cast<T>(this object obj)
2     {
3         return (T)obj;
4     }

 现在可以执行了。结果是***  同样还可以实现更多数据库操作。

 string还可以做更多更多事情,只要你支持它!但不要给它太多太大的权力,万一哪天比你强大了...

 (改)变(形)态篇 文章,仅供开拓思路,实际项目慎用!

时间: 2024-12-29 17:27:47

艾伟_转载:c#扩展方法奇思妙用变态篇四:string 的翻身革命的相关文章

c#扩展方法奇思妙用变态篇四:string 的翻身革命

string是各种编程语言中最基础的数据类型,长期以来受尽其它类的压迫,经常被肢解(Substring.Split).蹂躏(Join)... 而现在string要"翻身闹革命"了,它几乎无所不能,可以为所欲为,令其它类心惊胆颤... 让我们来看一下革命后的string做了些什么? 1. 打开文件或网址 1      "c:\\t.txt".Open(); 2      "http://www.cnblogs.com/ldp615/".Open()

c#扩展方法奇思妙用高级篇四:对扩展进行分组管理

从系列文章开篇到现在,已经实现的很多扩展了,但过多的扩展会给我们带来很多麻烦,试看下图: 面对这么多"泛滥"的扩展,很多人都会感到很别扭,的确有种"喧宾夺主"的感觉,想从中找出真正想用的方法来太难了!尽管经过扩展后的string类很"强大",但易用性确很差. 很多人因此感觉扩展应适可而止,不该再继续下去...其实这是一种逃避问题的态度,出现问题我们应该主动去解决,而不是去回避! 有很多种方法可以解决以上问题,最简单的就是使用将扩展放入不同name

c#扩展方法奇思妙用高级篇八:Type类扩展

Type 类提供了大量的属性和方法,但在一些基础性开发工作中,Type类功能还有些欠缺,尤其上在处理泛型类型时,如可空类型和泛型集合类型.下面的类就针对这些地方进行扩展. 1 public static class TypeHelper 2 { 3 public static bool IsNullableType(this Type type) 4 { 5 return (((type != null) && type.IsGenericType) && 6 (type.

c#扩展方法奇思妙用高级篇七:“树”通用遍历器

先看一个简单的类People(将作为测试用的例子): 1 public abstract class People 2 { 3 public bool IsMale { get; private set; } 4 public abstract IEnumerable<People> Children { get; } 5 } People类有一个Children属性,返回该People的所有孩子.People类通过Children属性最终可形成一个People树. "树"

c#扩展方法奇思妙用高级篇五:ToString(string format) 扩展

在.Net中,System.Object.ToString()是用得最多的方法之一,ToString()方法在Object类中被定义为virtual,Object类给了它一个默认实现: 1 public virtual string ToString() 2 { 3 return this.GetType().ToString(); 4 } .Net中原生的class或struct,如int,DateTime等都对它进行重写(override),以让它返回更有价值的值,而不是类型的名称.合理重写

c#扩展方法奇思妙用高级篇二:Aggregate扩展其改进

Enumerable.Aggregate 扩展方法在System.Linq命名空间中,是Enumerable类的第一个方法(按字母顺序排名),但确是Enumerable里面相对复杂的方法. MSDN对它的说明是:对序列应用累加器函数.备注中还有一些说明,大意是这个方法比较复杂,一般情况下用Sum.Max.Min.Average就可以了. 看看下面的代码,有了Sum,谁还会用Aggregate呢! public static void Test1() { int[] nums = new int[

c#扩展方法奇思妙用高级篇一:改进Scottgu的"In"扩展

先看下ScottGu对In的扩展: 调用示例1: 调用示例2: 原文地址:New "Orcas" Language Feature: Extension Methods(http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx) 很多介绍扩展方法的也大都使用"In"作为例子,但很少有人再深入想一步.个人感觉这个In扩展的不够彻

c#扩展方法奇思妙用高级篇三:Enumerable.Cast&amp;lt;T&amp;gt;应用

Enumerable.Cast<T>用于将IEnumerable转换为泛型版本IEnumerable<T>.转换后可尽情享用Enumerable的其它方法(如Where.Select),给我们的编码带来极大便利. 但MSDN中仅给出一个转换ArrayList的例子,很多人看了感觉现在都在用List<T>,还有谁会用ArrayList,Cast<T>没多少用处,除非处理一些之前遗留的一些代码. 其实Cast<T>并非如此简单,它可以用在很多地方.

c#扩展方法奇思妙用高级篇六:WinForm控件选择器

我们先看几个类图,深入认识一下我们常用的WinForm控件: 图1 ScrollableControl类图 图2 ButtonBase类图 图3 TextBoxBase类图 图4 ListControl类图 图5 Label类图 图6 其它常用 从图1中可以看出,Form与Button.Label一样,也是一个Control.