【问题标题】:How to create an instance from string name?如何从字符串名称创建实例?
【发布时间】:2013-12-04 23:51:18
【问题描述】:

类似于this question,但我正在寻找 Haxe 3.0 解决方案。我正在寻找基于字符串(来自我的数据文件)实例化一个类。

据我所知,这是正确的。但是,我收到运行时错误

[Fault] exception, information=No such constructor npc.NPC_Squid
Fault, createEnum() at Type.hx:166

Haxe 3 代码:

var e = haxe.macro.Expr.ExprDef;            
var instance :Dynamic = e.createByName( "npc." +  data.character, [] );
    //....

我的班级:

package npc;

import flash.display.Bitmap;
import flash.display.Sprite;
import flash.events.Event;
import openfl.Assets;

class NPC_Squid extends Sprite
{   
    public function new()
    {
        super();
        addEventListener( Event.ADDED_TO_STAGE, onAdded);
        addEventListener( Event.REMOVED_FROM_STAGE, onRemoved);

    }
//....

我的包裹看起来是正确的。关于为什么找不到构造函数的任何想法?

【问题讨论】:

标签: reflection types instantiation haxe


【解决方案1】:

我想你会需要这个:

 var myInstance = Type.createInstance(Type.resolveClass("mypackage.MyClass"));

注意如果你使用dead-code elimination,你应该在某处导入/引用MyClass。 我主要在我的 Main 类中为这些事情创建一个函数 forceCompile

 public static function main() 
 {
    forceCompile();

    // Wind up all your stuff
 }

 public static function forceCompile()
 {
      MyClass;
 }

【讨论】:

  • 我尝试了强制引用技巧......没有运气。此外,HaXe 3.0 中不存在 Type.createInstance。这就是为什么我使用宏 createByName(...);看起来它正在尝试解析构造函数(但没有找到它)。
  • Type.createInstance() 尚未在 Haxe 3 中删除,应该可以工作。未找到构造函数的可能原因是 DCE(在这种情况下只需添加 @:keep)或该类型未在项目的任何位置导入。
  • 噢噢噢噢。哈哈,我不小心自动导入了 haxe.macro.Type 这就是为什么它说这些函数不存在!
【解决方案2】:

在我的 Haxe 3 项目中,我使用:

var easing: IEasing = Type.createEmptyInstance(Type.resolveClass("motion.easing." + easingType + easingStyle));

而且效果很好。一个重要的精度:您需要导入所有可以通过这种方式创建的类。我导入了所有 motion.easing 包以确保。

你可以看到完整的例子here

【讨论】:

  • 噢噢噢噢。哈哈,我不小心自动导入了 haxe.macro.Type 这就是为什么它说这些函数不存在!
  • 我最终需要参数,所以我选择了 createInstance
猜你喜欢
  • 2015-11-23
  • 2014-06-04
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多