List <Module> list=new List <Module>();
list.Add((Module)Activator.CreateInstance(typeof(Module)));//--> 这个是正确的
//-----错误代码如下------
Assembly assembly=Assembly.LoadFile("bin/module.dll");
Type[] types=assembly.GetTypes();
int i;
for(i=0;i <types.Lenght;i++)
{
if(types[i].Name=="Module")
{
list.Add(((Module)Activator.CreateInstance(types[i])));
//---> 这里创建的实例,虽然不会报语法错误,但执行起来不正常
//我设置断点看到 list.Count=1;list中有一个实例存在
}
} 也就是说 Activator.CreateInstance(typeof());这样的是正确的,执行起来没任何问题。
但是 Activator.CreateInstance(Assembly.GetTypes());--->用Assembly.GetTypes()出来的type,建立实例以后会出现问题。我反复测试过。Assembly.GetTypes()出来的Type是有问题的。不知道为何。谁能解释一下。
Type[] types=assembly.GetTypes();
int i;
for(i=0;i <types.Lenght;i++)
{
if(types[i].Name=="Module") //只加入name==module的type
{
list.Add(((Module)Activator.CreateInstance(types[i])));
//---> 这里创建的实例,虽然不会报语法错误,但执行起来不正常
//我设置断点看到 list.Count=1;list中有一个实例存在
}
} list 中当然只有一个实例了
static Main()
{
App.Init();
}public static App
{
public List<IModule> Modules;
public static void Init()
{
//实例化泛
Modules=new List<IModule>(); //反射开始
Assembly assembly=Assembly.LoadFile("bin/module.dll");
Type[] types=assembly.GetTypes();
int i;
for(i=0;i<types.Lenght;i++)
{
//从IModule继承的,放入泛
if(IsModule(types[i])==true)
{
Modules.Add(((IModule)Activator.CreateInstance(type[i])));
}
}
//加载完毕,运行
int index=IndexOf("m0");
Modules[index].Run();//---->执行的是Module0.Run(),此操作是正常的
//此时Module0.Run()调用Module30.Run()
//此时问题出现了,Modules=null了。
//整个App参数下的数据成员全部为null
//包括下面那个abc,也是空的
//错误就出在这里,大家帮我看看是怎么回事
}
static string abc="abc"; public int IndexOf(string name)
{
int i,index;
index=-1;
for(i=0;i<Modules.Count;i++)
{
if(Modules[i].Name==name)
{
index=i;
break;
}
}
return index;
} //返回类型是否符合IModule接口
static bool IsModule(Type type)
{
//获取所有接口
Type[] interfaces = type.GetInterfaces();
int i;
bool has = false;
for (i = 0; i < interfaces.Length; i++)
{
//如果有接口为模块接口
if (interfaces[i] == typeof(IModule))
{
has = true;
break;
}
}
return has;
}
}public class Module0:IModule
{
public string Name
{
return "m0";
} public void Run()
{
int index=App.IndexOf("m30");
App.Modules[index].Run();
}
}public class Module30:IModule
{
public string name
{
return "m30";
} //方法为空
public void Run(){}
}public class Module1---29...//这些都和Module30相同
public interface IModule
{
string Name{get;}
void Run();
}