静态代理
也称为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");
}
}
}
还不快抢沙发