我定义了一个接口,想通过这个接口,主窗体能够调用通过反射动态创建的控件里的方法,因为这个方法中包含了在此控件需经过处理的数据,所以每次调用的时候都会报错,请问各位高手应该如何解决。
代码如下:
主窗体:
Type temp = null;
        private void creatObj(string assemblyurl,string typename, DirectoryInfo di)
        {
            FileInfo[] subapps = null;
            try
            {
                if (di != null)
                {                   
                    //检查SubApp目录下是否有程序集
                    subapps = di.GetFiles(assemblyurl);
                    if (subapps != null)
                    {
                        string path = subapps[0].FullName;
                        //动态加载程序集
                        Assembly subappassembly = Assembly.LoadFrom(path);
                        //根据控件的强类型,从程序集中动态创建控件
                        temp = subappassembly.GetType(typename);
                        newmenucontrol = temp.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public 
                            | BindingFlags.NonPublic |BindingFlags.Instance | BindingFlags.CreateInstance, null, null,null);
                             
                    }                    
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("文件读取错误:\n" + e.Message);
            }
        }
private void objset(object obj,string method)
        {
            System.Reflection.MethodInfo mi = obj.GetType().GetMethod(method);
            mi.Invoke(obj, null);
                    }
private void barManager1_ItemClick(object sender, ItemClickEventArgs e)
        {
            getassembly(menuds.Tables[0],Dockbar1.SelectedDockContainerItem.Text);
            creatObj(assemblyurl,typename, new DirectoryInfo(Application.StartupPath));
            
            
            string method = "runinterface";
            objset(newmenucontrol, method);            
        }  
控件代码:
private void runinterface()
        {
            InterfaceComp iobj = new TestClass();
            iobj.TestEvent += new TestDelegate(dataAdd);
            iobj.FireAway();
        }        
        
        private void dataAdd()
        {           
            //string fittingid = "";
            string patchno = "";
            //string fittingid = tvFitting.SelectedNode.Name;
            patchno = fittingid + sDate.DateTime.ToString("yyyyMMddhhmm");
            ............
        }

解决方案 »

  1.   

    http://www.51cto.com/html/2005/0920/3370.htm:) 加油!
      

  2.   

    控件中的函数我在控件里直接运行是可以的,但是在住窗体里就报错了,因为我只初始化了这个控件类,对控件的后面的改变不知道带过来没有,总是报什么没有new的错误
      

  3.   

    比如我有一个主窗口A加载控件B,需要用A中的按钮来使用B的方法,因为加载控件是随意的,根据控件判断需要调用的方法,所以是通过反射的方式来实现,请问各位高手该怎么做才好呢?
      

  4.   

    newmenucontrol = temp.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public 
                                | BindingFlags.NonPublic |BindingFlags.Instance | BindingFlags.CreateInstance, null, null,null);
    这句话有问题
    try
    Activator.CreateInstance( temp );
      

  5.   

    to hdt(倦怠) :
    还是报一样的错误,老是报“未将对象引用设置到对象的实例”。还有:如果我想通过方法名称来调用不同控件中的方法,应该怎么做呢?
      

  6.   

    定义一个接口,如:
    interface IProvider

        void Func();
    }
    在A中加载这个接口private IProvider provider;
    public IProvider Provider
    {
      set{provider = value;}
    }A中使用B方法的地方调用接口的方法:
    provider.Func();只要在B中实现这个接口就可以了
      

  7.   

    to hdt(倦怠) :
    temp不为空,信息已经取得了
      

  8.   

    to xyh2002(凌) :
    对于接口不是太了解,能不能给几个例子,感谢!!
    email:[email protected]
      

  9.   

    typename你传进去的是什么东西?
      

  10.   

    typename是我传过去的类名而已