本人近期开始学习Castle,希望与大家进行交流。通过分析DynamicProxy自带的
测试例子,发现DynamicProxy1.1.5的功能如下。希望对初学者有一定的帮助
(1):支持没有公共构造函数的类,能截获非公共virtual方法的调用
(2):只有虚方法(属性)能被Intercept
(3):能区分不同命名空间下的同名类
(4):对集合ArrayList的支持
[Test]
public void ProxyArrayListICollectionCtor()
{
ProxyGenerator generator = new ProxyGenerator();
ArrayList list = (ArrayList)generator.CreateClassProxy(typeof(ArrayList),new StandardInterceptor(), (ICollection)new int[]{1,2,3});
Assert.AreEqual(3,list.Count);
}
(5)支持序列化public void ProxyArrayListICollectionCtor()
{
ProxyGenerator generator = new ProxyGenerator();
ArrayList list = (ArrayList)generator.CreateClassProxy(typeof(ArrayList),new StandardInterceptor(), (ICollection)new int[]{1,2,3});
Assert.AreEqual(3,list.Count);
}
(6)提供mixin功能.
此外Dynamic还提供了对System.Reflection.Emit功能的封装
例:
EasyType typebuilder = new EasyType( module, "GxAdd" );
FieldReference fdX = typebuilder.CreateField( "X", typeof(int) );
FieldReference fdY = typebuilder.CreateField( "Y", typeof(int) );
ArgumentReference arg1 = new ArgumentReference(typeof(int));
ArgumentReference arg2 = new ArgumentReference(typeof(int));
EasyConstructor constr = typebuilder.CreateConstructor(arg1,arg2);
constr.CodeBuilder.InvokeBaseConstructor();
constr.CodeBuilder.AddStatement( new AssignStatement( fdX, arg1.ToExpression() ) );
constr.CodeBuilder.AddStatement( new AssignStatement( fdY, arg2.ToExpression() ) );
constr.CodeBuilder.AddStatement( new ReturnStatement() );
EasyMethod WriteMethod = typebuilder.CreateMethod( "AddXY",new ReturnReferenceExpression( typeof(int) ));
Type[] wlParams = new Type[] { typeof(object),
typeof(object)};
MethodInfo WriteLine = typeof(Console).GetMethod("WriteLine",wlParams);
WriteMethod.CodeBuilder.AddStatement(new ReturnStatement(
new BinaryExpression( BinaryExpression.Add, fdX.ToExpression(), fdY.ToExpression() ) ));
return typebuilder.BuildType();
以上代码能产生如下的两个数相加的功能.FieldReference fdX = typebuilder.CreateField( "X", typeof(int) );
FieldReference fdY = typebuilder.CreateField( "Y", typeof(int) );
ArgumentReference arg1 = new ArgumentReference(typeof(int));
ArgumentReference arg2 = new ArgumentReference(typeof(int));
EasyConstructor constr = typebuilder.CreateConstructor(arg1,arg2);
constr.CodeBuilder.InvokeBaseConstructor();
constr.CodeBuilder.AddStatement( new AssignStatement( fdX, arg1.ToExpression() ) );
constr.CodeBuilder.AddStatement( new AssignStatement( fdY, arg2.ToExpression() ) );
constr.CodeBuilder.AddStatement( new ReturnStatement() );
EasyMethod WriteMethod = typebuilder.CreateMethod( "AddXY",new ReturnReferenceExpression( typeof(int) ));
Type[] wlParams = new Type[] { typeof(object),
typeof(object)};
MethodInfo WriteLine = typeof(Console).GetMethod("WriteLine",wlParams);
WriteMethod.CodeBuilder.AddStatement(new ReturnStatement(
new BinaryExpression( BinaryExpression.Add, fdX.ToExpression(), fdY.ToExpression() ) ));
return typebuilder.BuildType();
能否通过Castle.DynamicProxy动态产生如下代码:
void WriteData(int x ,int y)
{
Console.WriteLine("{0},{1}",x,y);
}