using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace MyExtensionLibrary
{
public static class MyExtensions
{
public static void DisplayDefiningAssembly(this object obj)
{
// 该方法允许任意object显示它被定义的程序集
Console.WriteLine("{0} lives here:\n\t->{1}\n", obj.GetType().Name, Assembly.GetAssembly(obj.GetType()));
}
public static int ReverseDigits(this int i)
{
char[] digits = i.ToString().ToCharArray(); // 先转换为string,再存到数组中
Array.Reverse(digits); // 逆序排列
string newDigits = new string(digits);
return int.Parse(newDigits); // 以int类型返回
}
}
}
注意,如果想在库外调用这些方法,必须在类名前面加上public,因为C#默认的访问级别是private。在这里,还可以显示指明扩展应用,即在public static ...前面加上一个[Extension],当然现在并不必须这么做。
编译完成之后回到我们原来的那个工程,添加对这个新编译出来的MyExtensionLibrary.dll的引用,修改代码如下:
using System;
using MyExtensionLibrary;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int myInt = 12345678;
myInt.DisplayDefiningAssembly();
System.Data.DataSet ds = new System.Data.DataSet();
ds.DisplayDefiningAssembly();
System.Media.SoundPlayer sp = new System.Media.SoundPlayer();
sp.DisplayDefiningAssembly();
Console.WriteLine("Value of myInt: {0}", myInt);
Console.WriteLine("After reversed: {0}", myInt.ReverseDigits());
myInt.Foo();
myInt.Foo("This sample is provided by SpadeQ");
Console.ReadLine();
}
}
}
可以得到同样的结果,就像使用普通的方法一样。所有object类型都已经被加上了DisplayDefiningAssembly()扩展,所有的int类型还被加上了ReverseDigits()扩展,前提是我们无需分拆出object和int的代码,我们甚至连它的内部结构都不知道,但仍然可以向它们的数据类型“注入”我们自己想要的函数。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12641349/viewspace-145391/ ,如需转载,请注明出处,否则将追究法律责任。