none
Silverlight3中的反射怎么调用呢? RRS feed

  • 问题

  • 我现在的问题是:一个页面上要动态的加载一些自定义的silverlight控件,这些自定义控件的信息(比如:程序集名和类名)都是从数据库里面获取,而相应的DLL是通过添加引用而关联起来的。这些都做好后,怎么根据获取到控件信息动态的创建这些控件呢?我是新手,麻烦说详细点。。。

    2009年8月14日 7:13

答案

全部回复

  •         //C#反射模拟VB的CallByName函数,我真的喜欢VB,没办法你们都用C#
            //弄得我这个老程序员也得用C#
            public void Test() {
                //注意,我是喜欢这样定义变量的,因为我喜欢VB,当然C#我不会差,毕竟20年编程历史
                var InstanceA = new ClassA(); var Result = "";
                var FunctionName = ""; var MyType = (Type)null; var MyFunction = (System.Reflection.MethodInfo)null;
                //在编译前知道需要调用哪个程序,不用反射
                Result = InstanceA.FunctionA("Test", "Result");
                MessageBox.Show(Result);
                //在编译前不知道需要调用哪个程序,就得用反射。
                //比如从数据库读出菜单项,每个菜单项要调用哪个模块,都在菜单数据库里面。
                //如果在vb中,也可采用这种方式,但是vb有更为简单的CallByName函数。
                FunctionName = "FunctionA"; MyType = InstanceA.GetType(); MyFunction = MyType.GetMethod(FunctionName);
                if (MyFunction != null) {
                    Result = (String)MyFunction.Invoke(InstanceA, new String[] { "Test", "Result" });
                }
                MessageBox.Show(Result);
            }
            public class ClassA {
                public String FunctionA(String ParamA, String ParamB) {
                    return ParamA + ParamB;
                }
            }
    2009年8月14日 7:50
  • //忘记告诉你怎么告诉你怎么用反射创建类得实例
    //给你一点参考

    namespace SilverlightApplication1 {
        public partial class Page : UserControl {
            public Page() {
                InitializeComponent();
                Test();
            }
            public void Test() {
                var ClassName = "SilverlightApplication1.ClassA";
                var InstanceA = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(ClassName);
                var TypeA = InstanceA.GetType();
                var FunctionName = "FunctionA";
                var FunctionA = TypeA.GetMethod(FunctionName);
                var Param1 = "Test"; var Param2 = "Result";
                var Result = (String)FunctionA.Invoke(InstanceA, new String[] { Param1, Param2 });
                MessageBox.Show(Result);
            }
        }
        public class ClassA {
            public String FunctionA(String ParamA, String ParamB) {
                return ParamA + ParamB;
            }
        }
    }
    2009年8月14日 8:30
  • //忘记告诉你怎么告诉你怎么用反射创建类得实例
    //给你一点参考

    namespace SilverlightApplication1 {
        public partial class Page : UserControl {
            public Page() {
                InitializeComponent();
                Test();
            }
            public void Test() {
                var ClassName = "SilverlightApplication1.ClassA";
                var InstanceA = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(ClassName);
                var TypeA = InstanceA.GetType();
                var FunctionName = "FunctionA";
                var FunctionA = TypeA.GetMethod(FunctionName);
                var Param1 = "Test"; var Param2 = "Result";
                var Result = (String)FunctionA.Invoke(InstanceA, new String[] { Param1, Param2 });
                MessageBox.Show(Result);
            }
        }
        public class ClassA {
            public String FunctionA(String ParamA, String ParamB) {
                return ParamA + ParamB;
            }
        }
    }
    2009年8月14日 8:32
  • 不好意思,没有看懂你写的。。。
    2009年8月14日 9:03
  • 你不是需要根据名称创建类的实例,并根据名称调用类的实例的某个方法么?
    我就是提供这个思路给你!
    2009年8月14日 9:07
  • 我知道你是需要根据数据库里面的定义的名称来调用某个东西,对不?
    我提供的就是这个思路,并且我所作的项目基本都是在数据库里面设置
    不是在程序中静态调用,是用后期绑定(通过反射实现),这种灵活性较强的办法。
    2009年8月14日 9:10
  • 我知道你是需要根据数据库里面的定义的名称来调用某个东西,对不?
    我提供的就是这个思路,并且我所作的项目基本都是在数据库里面设置
    不是在程序中静态调用,是用后期绑定(通过反射实现),这种灵活性较强的办法。

    是的,就是在运行的时候根据获取的控件信息动态的加载控件,然后把控件显示到页面上。
    2009年8月14日 9:19
  • //忘记告诉你怎么告诉你怎么用反射创建类得实例
    //给你一点参考

    namespace SilverlightApplication1 {
        public partial class Page : UserControl {
            public Page() {
                InitializeComponent();
                Test();
            }
            public void Test() {
                var ClassName = "SilverlightApplication1.ClassA";
                var InstanceA = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(ClassName);
                var TypeA = InstanceA.GetType();
                var FunctionName = "FunctionA";
                var FunctionA = TypeA.GetMethod(FunctionName);
                var Param1 = "Test"; var Param2 = "Result";
                var Result = (String)FunctionA.Invoke(InstanceA, new String[] { Param1, Param2 });
                MessageBox.Show(Result);
            }
        }
        public class ClassA {
            public String FunctionA(String ParamA, String ParamB) {
                return ParamA + ParamB;
            }
        }
    }

    我按照你写,但是到   var InstanceA = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(ClassName);
    这一步,获取的是null。。有没有查考的资料呢,麻烦指教下。。。
    2009年8月14日 9:26
  • 比如运行时,你可能需要调用Page2,但在编译前,你不知道你需要调用Page2,
    那么你就得用反射,创建Page2的实例,你可以将这个创建好的实例
    绑定到 Application.RootVisual,这个东西就编程了Page2
    2009年8月14日 9:30
  • 类的名称,一定要对。放的位置要对,比如你可以把这个ClassA当成一个silverlight的页面!
    CreateInstance出来的就是哪个Silverlight页面。我其实只是举例说明。上面哪个例子时一定能运行的,我试验了!

    2009年8月14日 9:35
  • 还有你的命名空间可能更我做的例子不一样,所有会出null值。无法创建那个类的实例。
    2009年8月14日 9:38
  • 现在调用的是外部一个程序集,而不是当前程序集,不知道跟这个有没有关系?
    还有就是因为添加引用和命名空间了,所以可以直接应用这个类型,就比如 MyNameSpace.MyTextBox = new MyNameSpace.MyTextBox();但是根据"MyNameSpace.MyTextBox"反射出来却是null也不知道这两个有关系没有?
    2009年8月14日 9:43
  • 有关系!如果你把具体情况告诉我,我可以弄个例子给你看。反射的功能非常强大,其实就是相当于编译器。
    你甚至可以反射你的源代码!
    2009年8月14日 9:45
  • 有关系哟。你的把你的东西打包给我看看,我可以弄个例子给你!
    反射的功能非常强大,反射其实相当于编译器,甚至可以反射源代码!
    2009年8月14日 9:48
  • 举个反射源代码的需求情况给大家参考:
    比如你容用户输入表达式: 3+5*(6+4)*Log(25)
    你要根据用户输入的表达式字符串生成计算结果
    你就得用反射!

    2009年8月14日 9:55
  • 有关系哟。你的把你的东西打包给我看看,我可以弄个例子给你!
    反射的功能非常强大,反射其实相当于编译器,甚至可以反射源代码!

    其实就是在程序中加载一个自定义的程序集,然后反射出来,实例化,加载。。在桌面版的程序中都已经实现了,在silverlight中怎么就这么麻烦呢

    2009年8月14日 10:02
  • 你好,
    请参考:
    http://silverlight.net/forums/p/18972/65279.aspx#65279
    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Need a sample of a technique of Microsoft? Just check out CodeFx first! http://cfx.codeplex.com/
    • 已标记为答案 klyun 2009年8月18日 1:25
    2009年8月17日 3:47
    版主
  • 谢谢Allen chen的帮助。现在就剩下一个问题,就是dll的路径问题,怎么设置呢?必须把dll拷贝到client文件下吗。有没有更好的办法。。

    2009年8月17日 9:41
  • 你只要提供一个URL能够提供这个dll就可以了.比如你可以放到自己的服务器上,用自己写的HttpHandler,等等,可以放到任何地方.
    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Need a sample of a technique of Microsoft? Just check out CodeFx first! http://cfx.codeplex.com/
    2009年8月17日 10:55
    版主