获取 Haxe 中具有空值的 class 字段的类型
Get type of class field with null value in Haxe
是否可以在 haxe 中获取 class 个空值字段?
函数 "Type.getClass" 获得 class 的值(在运行时设置),但我需要在编译时获得 class 定义。
函数 "getClassFields" returns 只有字段名称,没有 classes.
例如:
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
在我的情况下,我无法更改 class MyCls 的来源。
谢谢。
你可以试试Runtime Type Information
。这是一个 Haxe 特性,允许在运行时获取类型的完整描述。
http://haxe.org/manual/cr-rtti.html
由于您需要获取空字段的类型,因此您确实需要求助于 Haxe 的运行时类型信息 (RTTI)(@RealylUniqueName 推荐)。
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
class 来添加它。然后解决方案是通过构建文件中的宏添加它。例如,如果您使用的是 .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
是否可以在 haxe 中获取 class 个空值字段?
函数 "Type.getClass" 获得 class 的值(在运行时设置),但我需要在编译时获得 class 定义。
函数 "getClassFields" returns 只有字段名称,没有 classes.
例如:
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
在我的情况下,我无法更改 class MyCls 的来源。
谢谢。
你可以试试Runtime Type Information
。这是一个 Haxe 特性,允许在运行时获取类型的完整描述。
http://haxe.org/manual/cr-rtti.html
由于您需要获取空字段的类型,因此您确实需要求助于 Haxe 的运行时类型信息 (RTTI)(@RealylUniqueName 推荐)。
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
class 来添加它。然后解决方案是通过构建文件中的宏添加它。例如,如果您使用的是 .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