静态代理

也称为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");
  }

}
}


本文由 hcb 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论