我定义了一个接口,想通过这个接口,主窗体能够调用通过反射动态创建的控件里的方法,因为这个方法中包含了在此控件需经过处理的数据,所以每次调用的时候都会报错,请问各位高手应该如何解决。
代码如下:
主窗体:
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");
............
}
代码如下:
主窗体:
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");
............
}
解决方案 »
- .net自动更新(环境vs2005)给个能运行的程序+源码
- 无法将类型“object”隐式转换为“string”。存在一个显式转换(是否缺少强制转换?)
- DES加密解密 CreateEncryptor 的函数解释
- sql行列转置 动态(C#)
- c# 判断 搜索引擎url后查询关键字的编码。关键字:GB2312,UTF-8
- 水晶报表的打印,分组问题
- 关于Wpf的Fluent Ribbon问题。
- 求助!如何右键点击treeview中的一个节点后,将这个节点选取中?
- C#中如何把结构用SqlDataReader存入再读出来呀?
- 紧急求助:winform程序当掉了。
- 在winform中CheckBox的问题
- 怎样才能做个摇奖程序?最好用c#!
| BindingFlags.NonPublic |BindingFlags.Instance | BindingFlags.CreateInstance, null, null,null);
这句话有问题
try
Activator.CreateInstance( temp );
还是报一样的错误,老是报“未将对象引用设置到对象的实例”。还有:如果我想通过方法名称来调用不同控件中的方法,应该怎么做呢?
interface IProvider
{
void Func();
}
在A中加载这个接口private IProvider provider;
public IProvider Provider
{
set{provider = value;}
}A中使用B方法的地方调用接口的方法:
provider.Func();只要在B中实现这个接口就可以了
temp不为空,信息已经取得了
对于接口不是太了解,能不能给几个例子,感谢!!
email:[email protected]