在Haxe中获取具有空值的类字段类型

时间:2016-11-21 09:27:58

标签: class types metaprogramming haxe neko

是否可以在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类的来源。

感谢。

2 个答案:

答案 0 :(得分:3)

您可以尝试myApp.directive('modal', function () { return { template: '<div class="modal fade">' + '<div class="modal-dialog">' + '<div class="modal-content">' + '<div class="modal-header">' + '<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>' + '<h4 class="modal-title">{{ title }}</h4>' + '</div>' + '<div class="modal-body" ng-transclude></div>' + '</div>' + '</div>' + '</div>', restrict: 'E', transclude: true, replace:true, scope:true, link: function postLink(scope, element, attrs) { scope.title = attrs.title; scope.$watch(attrs.visible, function(value){ if(value == true) $(element).modal('show'); else $(element).modal('hide'); }); $(element).on('shown.bs.modal', function(){ scope.$apply(function(){ scope.$parent[attrs.visible] = true; }); }); $(element).on('hidden.bs.modal', function(){ scope.$apply(function(){ scope.$parent[attrs.visible] = false; }); }); } }; }); .state("abc"){ controller:function(){ $scope.showModal = false; $scope.toggleModal = function(){ $scope.showModal = false; $scope.showModal = !$scope.showModal; var aclpGuid = $stateParams.aclpGuid; }; } } 。这是一个Haxe功能,允许在运行时获取类型的完整描述。 http://haxe.org/manual/cr-rtti.html

答案 1 :(得分:2)

由于你需要获取null字段的类型,你真的需要求助于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