静态代理
也称为AOP编程 ,而向切面的编译 (Aspect orient programming).
主要是把一些和业务无关的代码,如调用日志,发送邮件 等做为一个业务代码的切面 。
一般是在不改变原有代码的基础上,增加增加增加,和相应的实现代码。在实现代码里增加切面的代码如,如调用日志,然后再调用原业务类的方法 ,等价于对原先业务代码的扩展 。
静态代理。
编译时代理,编译的时候已经存在。 需要手写代码实现 。 如下 ,对add 方法增加调用前后的日志 , 增加一个新类调用原有的add方法 ,然后把日志进行相应的输出。 是设计模式中的代理模式应用 。也叫静态代理。
class Program
{
static void Main(string[] args) { //new A().add(); new A2().add(); Console.ReadKey(); }
}
class A
{
public void add() { Console.WriteLine("add method"); }
}
class A2
{
public void add() { Console.WriteLine("before a ivnoke"); new A().add(); Console.WriteLine("after a invoke"); }
}
也可以通过override来实现 。主要是对基类方法进行重写,增加相应的日志。
class Program
{
static void Main(string[] args) { //new A().add(); new A2().add(); Console.ReadKey(); }
}
class A
{
public virtual void add() { Console.WriteLine("add method"); }
}
class A2:A
{
public override void add() { Console.WriteLine("before a ivnoke"); base.add(); Console.WriteLine("after a invoke"); }
}
通过反射来调用
class Program
{
static void Main(string[] args) { //new A().add(); new A2().add(); Console.ReadKey(); }
}
class A
{
public void add() { Console.WriteLine("add method"); }
}
class A2
{
public void add() { Console.WriteLine("before"); A obj =(A)Activator.CreateInstance(typeof(A)); obj.add(); Console.WriteLine("after"); }
}
反射2 ,要调用的类,在另一个类库中, 必须 通过reflection.Assembly.LoadFrom方法来加载类。通过type找到对应的在方法名,然后通过invoke来调用
class Program
{
static void Main(string[] args) { //new A().add(); new A2().add(); Console.ReadKey(); }
}
class A2
{
public void add() { Console.WriteLine("before"); var assem=System.Reflection.Assembly.LoadFrom(".//A.dll"); var types = assem.GetTypes(); foreach (var type in types) { var fund = type.GetMethod("add"); fund.Invoke(null,null); } Console.WriteLine("after"); }
}
//新建一个类库,命名为a
namespace A
{
public class A
{
public static void add() { Console.WriteLine("add method"); }
}
}