2

是否可以在 haxe 中获取具有空值的字段类?

函数“Type.getClass”获取值类(在运行时设置),但我需要在编译时定义类。

函数“getClassFields”只返回字段名称,不返回类。

例如:

class MyCls
{
   public static var i:Int = null;
   public static var s:String = null;
}

trace(Type.getClass(MyCls.i)); // show "null", but I need to get Int
trace(Type.getClass(MyCls.s)); // show "null", but I need to get String

在我的情况下,我无法更改 MyCls 类的来源。

谢谢。

4

2 回答 2

3

你可以试试Runtime Type Information。这是一个 Haxe 功能,允许在运行时获取类型的完整描述。 http://haxe.org/manual/cr-rtti.html

于 2016-11-21T15:27:47.060 回答
2

由于您需要获取空字段的类型,因此您确实需要求助于 Haxe 的运行时类型信息 (RTTI)(推荐为 @ReallylUniqueName)。

import haxe.rtti.Rtti;
import haxe.rtti.CType;

class Test {
    static function main()
    {
        if (!Rtti.hasRtti(MyCls))
            throw "Please add @:rtti to class";
        var rtti = Rtti.getRtti(MyCls);
        for (sf in rtti.statics)
            trace(sf.name, sf.type, CTypeTools.toString(sf.type));
    }
}

现在,显然,有一个问题......

RTTI 需要@:rtti元数据,但您说您不能更改MyCls类来添加它。然后解决方案是通过构建文件中的宏添加它。例如,如果您使用的是.hxml文件,它应该如下所示:

--interp
--macro addMetadata("@:rtti", "MyCls")
-main Test

有了这个和您自己的MyCls定义,输出将如下所示:

Test.hx:11: i,CAbstract(Int,{ length => 0 }),Int
Test.hx:11: s,CClass(String,{ length => 0 }),String
于 2016-11-22T20:58:03.160 回答