|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。反射是静态猎取程序集的元数据的一种手艺,这句话是做.NET程序员口试标题的一个的谜底,你可选择记着它,就比如高中生物学内里讲到的细胞的布局的课程时,细胞由细胞膜,细胞质和细胞核构成。依据做程序的履历,Neveraskwhy不是好习气,即便是微软的API,偶然候违背了挪用商定,也会很抓狂。
请看上面这一段代码
Assemblyassembly=Assembly.GetExecutingAssembly();
objectentryForm=Activator.CreateInstance(formBaseType)asForm;
entryForm.MdiParent=this;
entryForm.Show();
entryForm.Activate();
代码的寄义对照复杂,从以后程序会合创立formBaseType范例,并挪用它的办法。从办法名下去看,也许能够看出,这是一段MDI创立child子窗体,并显现子窗体的代码。
这段小代码,也是插件式框架的基础思绪,请参考《ManagementConsole工具办理类软件通用开辟框架(开放源码)》中的例子来体味它的用途。
在ERP/MIS体系中,使用反射的例子,其实是太多了。数据会见接口InventoryMovementDAL,借助于反射,来查找并挪用它的完成类;窗体也它的子窗体借助于反射来猎取属性,传送值;ERP体系的全部框架,也是借助于反射搭建起来.
看上面的图,ERP的三个模块Paradox.ERP.SystemAdministration,Paradox.ERP.Engineering,Paradox.ERP.Inventory被Paradox.Framework.Kernal反射挪用,假如再写一个Paradox.ERP.Sales的发卖模块,几近不必要修改,就能够让它被框架挪用。
静态编译的例子,是使用到一个人为体系中.请看图
关于怎样剖析人为的formular公式,有多少种举措,这里使有的是静态编译的办法。把每个人为项当作是一个范例class的属性,Formular的内容则放到一个办法中往,当做表达式盘算求职,最初使用反射,前往各属性的值便可。
publicclassFormularCalculation
{
publicstaticobjectBuild(string[]items,stringformular)
{
stringnameSpace="A";
stringclassName="FormularCalculation";
stringmethodName="Run";
CSharpCodeProvidercompiler=newCSharpCodeProvider();
CompilerParametersparas=newCompilerParameters();
paras.GenerateExecutable=false;
paras.GenerateInMemory=true;
StringBuilderclassSrc=newStringBuilder();
classSrc.Append("usingSystem;"+Environment.NewLine);
classSrc.Append("namespace"+nameSpace+"{"+Environment.NewLine);
classSrc.Append("publicclass"+className+"{"+Environment.NewLine);
foreach(stringiteminitems)
{
classSrc.Append("publicdecimal"+item+";"+Environment.NewLine);
}
classSrc.Append("publicvoidRun(){基础人为=5000;"+Environment.NewLine);
string[]format=Regex.Split(formular,Environment.NewLine);
foreach(stringpropinformat)
{
classSrc.Append(prop+";"+Environment.NewLine);
}
classSrc.Append("}"+Environment.NewLine);
classSrc.Append("}"+Environment.NewLine);
classSrc.Append("}"+Environment.NewLine);
stringsource=classSrc.ToString();
CompilerResultsresult=compiler.CompileAssemblyFromSource(paras,source);
CompilerErrorCollectionerror=result.Errors;
Assemblyassembly=result.CompiledAssembly;
objecteval=assembly.CreateInstance(nameSpace+"."+className);
MethodInfomethod=eval.GetType().GetMethod(methodName);
objectreobj=method.Invoke(eval,null);
returneval;
}
}
挪用办法以下
string[]items={"应发算计","基础人为","奖金","福利费","扣款算计","社保","税","实发算计","应税所得额"};
stringformular=@”应发算计=基础人为+奖金+福利费-扣款算计;
扣款算计=社保+税+应税所得额;
实发算计=应发算计-扣款算计;";
objectobj=FormularCalculation.Build(items,formular);
Typetype=obj.GetType();
foreach(PropertyInfofiintype.GetProperties(BindingFlags.NonPublic|BindingFlags.Public
|BindingFlags.Instance|BindingFlags.DeclaredOnly))
{
stringvalue=fi.Name;//取到盘算后的各个属性的值
}
静态编译还使用于软件的加密,在内存中发生加密程序的源代码,静态编译并运转,检测是不是切合license受权。
有专家说:java不是跨平台,java就是平台,这很好的定义了java的特点。有了java,你只需要等待java平台在新平台上移植。这还不错吧!只是,java不是一个平台,而是多个平台。你需要在这个java平台移植到另一个java平台。 |
|