我创建了一个抽象类和一个脚本提供程序,它使用ScriptDomProvider编译脚本(脚本继承自该抽象类)。这就是我加载它们的方式:
foreach (var script in System.IO.Directory.GetFiles("..\\DataSvr\\Script\\Compiled\\", "*.compiled"))
{
var shortname = System.IO.Path.GetFileNameWithoutExtension(script);
if (!usedNpcScripts.ContainsKey(shortname))
{
Assembly assembly = Assembly.Load(File.ReadAllBytes(Environment.CurrentDirectory + "\\" + script));
Type[] types = assembly.GetExportedTypes();
foreach (Type type in types)
{
if (!GameServer.NpcScripts.ContainsKey(shortname))
{
GameServer.NpcScripts.Add(shortname, type);
}
}
}
}
所以,我得到了那种类型。现在,我的抽象类被命名为“NpcScript”。如何将该类型强制转换为该类,以便从中调用方法?最好的问候。
此外,是否有更好的方法来加载脚本?比如,从路径中将它加载到“NpcScript”类型的对象(它继承的对象)中?我正在做正确的事吗?
答案 0 :(得分:0)
假设您的意思是“创建一个实例”,而不是“强制转换”,请使用Activator.CreateInstance
。此重载采用Type
参数,创建实例对象并将其返回给您。
答案 1 :(得分:0)
首先,您需要过滤掉类型。您将使用IsSubClassOf方法执行此操作,然后使用Activator.CreateInstance
实例化该类型。
所以你的代码看起来像这样。
foreach (Type type in types)
{
if(!type.IsSubClassOf(typeof(NpcScript)) || type.IsAbstract)
{
continue;
}
if (!GameServer.NpcScripts.ContainsKey(shortname))
{
GameServer.NpcScripts.Add(shortname, type);
}
NpcScript myScript = (NpcScript)Activator.CreateInstance(type);
//Do whatever with myScript
}