如何利用反射和xml生成界面框架?
xml文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<FormStyles>
<Form Name="a" DllFileName="a.dll,className="a.a">
<ComandButton Name="Add" Width="300" TextAlign="right" BackColor="255,255,255" Height="400" Text="确定" >
</ComandButton >
<ComandButton Name="Delete" Width="300"TextAlign="right" BackColor="255,255,255"Height="400" Text="删除">
</ComandButton >
.......
</Form><Form Name="b" DllFileName="b.dll,className="b.b">
<ComandButton Name="Cancel" Width="30" TextAlign="right" BackColor="25,25,25" Height="40" Text="取消" >
</ComandButton >
<ComandButton Name="TT" Width="30"TextAlign="right" BackColor="25,25,25"Height="40" Text="TT">
</ComandButton >
</Form>
</FormStyles>所有的界面都是按照xml配置问文件生成的,事件都封装在相应界面(上例子中的a,b)的dll文件上了。
请问各个高手如何实现啊?小弟十分着急啊,谢谢了
xml文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<FormStyles>
<Form Name="a" DllFileName="a.dll,className="a.a">
<ComandButton Name="Add" Width="300" TextAlign="right" BackColor="255,255,255" Height="400" Text="确定" >
</ComandButton >
<ComandButton Name="Delete" Width="300"TextAlign="right" BackColor="255,255,255"Height="400" Text="删除">
</ComandButton >
.......
</Form><Form Name="b" DllFileName="b.dll,className="b.b">
<ComandButton Name="Cancel" Width="30" TextAlign="right" BackColor="25,25,25" Height="40" Text="取消" >
</ComandButton >
<ComandButton Name="TT" Width="30"TextAlign="right" BackColor="25,25,25"Height="40" Text="TT">
</ComandButton >
</Form>
</FormStyles>所有的界面都是按照xml配置问文件生成的,事件都封装在相应界面(上例子中的a,b)的dll文件上了。
请问各个高手如何实现啊?小弟十分着急啊,谢谢了
{
var mac = new XmlSerializer(type);
var tw = new StringWriter();
mac.Serialize(tw, obj, xmlns);
var ret = tw.ToString();
return ret;
} public static T 反序列化<T>(this string read)
{
var mac = new XmlSerializer(typeof(T));
XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();
xmlns.Add(String.Empty, String.Empty);
return (T)mac.Deserialize(new StringReader(read));
} public static UserControl 产生控件(this string str)
{
我的控件Type c=反序列化<我的空间Type>(str);
return c.ExecuteUserControl();
{
var mac = new XmlSerializer(typeof(T));
return (T)mac.Deserialize(new StringReader(read));
}
可见,xml序列化、反序列化比较简单。关键是你的自定义类型如何设计,如何实现它的接口中一个 ExecuteUserControl()方法。而这个方法设计,跟是否使用xml没有关系的,纯粹是面向对象设计问题。xml并不是你要设计的重点!
我宁愿使用Sqlserver数据库来存储项目模型
团队开发的时候,无论你的开发工具是c/s还是B/s
使用文件作为数据存储介质(当然也可以看做是数据库的一种)
并发问题、修订历史、版次问题等等会比较难处理
换汤不换药,工作量没有减少,关键要设计出哪怕是一两个常用的驱动UI的class,
那么开发人员可能少设计超过50个窗体,
如果不能确定开发量的边界,就很难控制开发成本,那报价也是想当然的、对己对人都不负责任的;2、我反对那种把业务逻辑、数据结构、UI混在一起设计的所谓万能的开发工具,
这样搞出来的程序很难满足个性化的、不断变化的用户需求,
而满足这样的需求是我们的利润来源
请问各个高手如何实现啊?小弟十分着急啊,谢谢了
---------------------------------------------------------------------
甘草兄的回复很到位。如果一个xml描述了一个界面。实现很容易,遍历节点创建对应的类型就可以了。如果用的都是系统控件的话是否反射到意义不大。如果不是系统的类型,可以根据dll反射来实现。至于这样做是否很好,不是我们讨论的关键,都已经说明现在有个系统架在这上面了。难道楼上其他朋友就希望你们几句话让他们改架构大动干戈?所有界面,你的意思已经有基于这个机制的一套代码了么?你其实已经自己说完如何实现了。
如果你有一个界面,而这个xml是使用序列化方式把某个窗体序列化的,那可以反序列化回来。但如果已经有窗体了。还用xml定义控件就多余了。你的dll里包含什么?只有事件定义么?xml描述了一个窗体的布局,dll里写了事件?两者如何联系起来的?
谢谢
看*你*d*l*l*里*是*什*么*如*果*是*窗*体 ,
private static void TestRefrance01()
{
Assembly asm = Assembly.LoadFile(@"D:\My code\VS2008\C#\Test\CSharpConsole01\TestLib\bin\Debug\TestLib.dll");
string assembly_name = asm.FullName.Substring(0, asm.FullName.IndexOf(','));
Form frm = asm.CreateInstance(assembly_name + ".Form1") as Form;
frm.ShowDialog();
}
这*样*可*以*反 射*方*式*创*建*窗*体 。但*这*样*根*本*用*不*到*x*m*l*文*件 。如*果*你*需*要*x*m*l*动*态*创*建*窗*体 ,遍*历*x*m*l*根*据*文*本 ,你*自*己*的*规*则 ,创*建*控*件 ,设*置*属*性 ,添*加*到*窗*体*就*可*以*了 。事*件*如*果*是*文*本*关*联*的 ,反*射*的*方*式*找*到*事*件*并*添*加*事*件 。如*果*你*能*问*的*具*体*一*点 ,或*许*能*早*就*得*到*答*案*了 。