如何利用反射和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文件上了。
请问各个高手如何实现啊?小弟十分着急啊,谢谢了

解决方案 »

  1.   

    几年前的技术了, 现在可以研究一下,组件技术, 将配置器与VS组件结合, 直接生成界面,所见即所得,不需要中间XML存储配置
      

  2.   

    你所说的那种方式,目前好像没找到开源的,不过可以参考:http://www.msdnwebcast.net/webcast/4390.aspx
      

  3.   

    利用C#.Net反射技术实现软件界面动态存储
      

  4.   

    http://topic.csdn.net/u/20100608/09/3b3ad050-1d6d-4b98-b0af-db68879aa97f.html
      

  5.   

    XML只是一种表示对象的清晰但低效的方法,它跟你的所谓“界面”之间,需要强大的解析和设计,你如果不懂填平这之间的差距(如果你拿不出详细的协议解析设计文档),最好不要动不动奢谈XML。我不是说这样不可能,恰恰相反,这对于你来说可能还是空洞的(内涵越小外延最大,但是外延大到一定程序就会变成成事不足败事有余的了)。
      

  6.   

    因为我看到了你用了“反射技术”这种话。实际上,搞过通讯的人对xml序列化、反序列化看得很基础。你可以把任何自定义对象(包括组合自定义类型对象的属性)形成xml文本,或者反序列化,只有5、6行代码就可以了。这只需要学2天,而不需要花那么多时间。忘记什么“反射技术”,去理解xml序列化、反序列化。
      

  7.   

    我举个例子(随便、临时想的):        public static string 序列化(this object obj, Type type)
            {
                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();
      

  8.   

    多余写了两行:        public static T 反序列化<T>(this string read)
            {
                var mac = new XmlSerializer(typeof(T));
                return (T)mac.Deserialize(new StringReader(read));
            }
    可见,xml序列化、反序列化比较简单。关键是你的自定义类型如何设计,如何实现它的接口中一个 ExecuteUserControl()方法。而这个方法设计,跟是否使用xml没有关系的,纯粹是面向对象设计问题。xml并不是你要设计的重点!
      

  9.   

    如果我从事的是基于Sqlserver的数据库应用程序的开发,
    我宁愿使用Sqlserver数据库来存储项目模型
    团队开发的时候,无论你的开发工具是c/s还是B/s
    使用文件作为数据存储介质(当然也可以看做是数据库的一种)
    并发问题、修订历史、版次问题等等会比较难处理
      

  10.   

    1、如果有100个窗体,如果都要设计,用vs设计换成自己的开发工具设计实际上是没有意义的,
       换汤不换药,工作量没有减少,关键要设计出哪怕是一两个常用的驱动UI的class,
       那么开发人员可能少设计超过50个窗体,
       如果不能确定开发量的边界,就很难控制开发成本,那报价也是想当然的、对己对人都不负责任的;2、我反对那种把业务逻辑、数据结构、UI混在一起设计的所谓万能的开发工具,
       这样搞出来的程序很难满足个性化的、不断变化的用户需求,
       而满足这样的需求是我们的利润来源
      

  11.   

    所有的界面都是按照xml配置问文件生成的,事件都封装在相应界面(上例子中的a,b)的dll文件上了。
    请问各个高手如何实现啊?小弟十分着急啊,谢谢了
    ---------------------------------------------------------------------
    甘草兄的回复很到位。如果一个xml描述了一个界面。实现很容易,遍历节点创建对应的类型就可以了。如果用的都是系统控件的话是否反射到意义不大。如果不是系统的类型,可以根据dll反射来实现。至于这样做是否很好,不是我们讨论的关键,都已经说明现在有个系统架在这上面了。难道楼上其他朋友就希望你们几句话让他们改架构大动干戈?所有界面,你的意思已经有基于这个机制的一套代码了么?你其实已经自己说完如何实现了。
    如果你有一个界面,而这个xml是使用序列化方式把某个窗体序列化的,那可以反序列化回来。但如果已经有窗体了。还用xml定义控件就多余了。你的dll里包含什么?只有事件定义么?xml描述了一个窗体的布局,dll里写了事件?两者如何联系起来的?
      

  12.   

    其实就是如何做这个框架以及如何把dll和框架连接起来?
      

  13.   

    高人能不能给些“xml框架设计”的实例啊?
    谢谢
      

  14.   

    用到反射还是必然的。反射DLL。脚本啊等。
      

  15.   

    其*实*就*是*如*何*做*这*个*框*架*以*及*如*何*把*d*l*l*和*框*架*连*接*起*来 ?这*个*只*有*你*自*己*清*楚 ,方*法*很*多 。
    看*你*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*根*据*文*本 ,你*自*己*的*规*则 ,创*建*控*件 ,设*置*属*性 ,添*加*到*窗*体*就*可*以*了 。事*件*如*果*是*文*本*关*联*的 ,反*射*的*方*式*找*到*事*件*并*添*加*事*件 。如*果*你*能*问*的*具*体*一*点 ,或*许*能*早*就*得*到*答*案*了 。
      

  16.   

    这是微软的WebCast,怎么会打不开呢??其实并不难,楼主为什么不试着自己去做呢??自己做一个控件, 告诉这个控件,XML文件的路径, 当程序运行的时候,这个控件找到XML文件, 对他进行解析, 并按照内容生成控件, 就这么简单....关于XML的内容,其实就是一个DataTabl. 里面保存一些控件的属性....