|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
c语言的编译器,几乎是所有新平台都有的。因此从这点上看,c语言的程序,比其他任何语言更加容易跨平台。我们利用静态代办署理,次要是由于静态代办署理具有如许的才能--使得某个范例A在运转的时分能转化为一个指定的接口I,即便这个范例A在界说的时分并没有从这个指定的接口I承继。这句话是甚么意义了?仍是回到当泛型的参数范例是静态的...一文中的谁人例子,在例子中,List并没有从ISimpleList承继,可是从外表看来,在运转的时分,我们经由过程静态代办署理能够以ISimpleList接口来“援用”List范例的工具。
静态代办署理是在运转时在内存中构建的一品种型,该范例完成了接口I,可是它将一切的办法挪用都转发给范例A。
注重,下面我利用了“办法”挪用的转发,因为,事务、属性都是办法的变体,以是,对接口中界说的一切元素的Call都能够主动态代办署理转发。那末,接口(I)中的办法与被代办署理者(Target)的办法怎样婚配起来了?一般的办法是,举行“同名”婚配,好比ISimpleList接口的Add办法就天然婚配到List的Add办法。关于庞大的需求,能够界说一个办法名映照表来婚配分歧名的办法。
因为,静态代办署理具有这类为范例(Target)“换脸”的才能,以是,在良多场所可使用它来文雅地办理一些之前难以处置的成绩(一般,之前我们利用反射来办理这些贫苦),好比:
(1)“泛型参数范例是静态的”,利用静态代办署理办理这类成绩不但能够制止反射带来的功能丧失,并且还能够取得强范例办法挪用的优点。
(2)为一组范例“变脸”。好比,TextBox、RichTextBox、ListView等windows控件都有Clear办法,可是它们都没有完成一个一致的接口(好比,该接口中界说了Clear办法),以是当我要清空某个GroupBox中一切控件的内容时,没法用一种一致的体例挪用,你不克不及如许做:
以下为援用的内容:
foreach(Controlcontrolinthis.groupBox1.Controls)
{
control.Clear();//Control不存在Clear办法,编译报错
}
可是有了静态代办署理以后,我们就能够为这些控件界说一个NewFace:
以下为援用的内容:
publicinterfaceINewFace
{
voidClear();
}
然后文雅地如许挪用:
以下为援用的内容:
foreach(Controlcontrolinthis.groupBox1.Controls)
{
INewFaceface=DynamicTypeEmitter.CreateDynamicProxy<INewFace>(control);
face.Clear();
}
你能够持续发掘利用静态代办署理的别的场所,发扬你的设想力,来展示静态代办署理的能力。
关于ESBasic中的DynamicTypeEmitter完成,有一点缺憾,那就是临时还不撑持“泛型办法”的挪用转发,我还不晓得怎样利用Emit发射对静态范例参数的泛型办法的挪用,有晓得的伴侣请引导下。
我以前很喜欢Serv-U,自从它用Java重写之后我就再也没用过,实在是太慢了,我宁可用IIS搭建FTP,虽然IIS搭建FTP在权限管理上很不灵活。 |
|