可编写脚本的抽象类

时间:2014-03-11 17:59:53

标签: c#

我创建了一个抽象类和一个脚本提供程序,它使用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”类型的对象(它继承的对象)中?我正在做正确的事吗?

2 个答案:

答案 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
}