在Haxe中使用Class <T>作为Map键

mep*_*eps 3 haxe inversion-of-control

我想使用模型的类或接口作为键将模型的实例存储在公共提供程序中,然后通过类引用将其弹出。我写了一些代码:

class Provider {

    public function new() { }

    public function set<T:Any>(instance:T, ?type:Class<T>) {
        if (type == null)
            type = Type.getClass(instance);
        if (type != null && instance != null)
            map.set(type, instance);
    }

    public function get<T:Any>(type:Class<T>):Null<T> {
        return cast map.get(type);
    }

    var map = new Map<Class<Any>, Any>();

}
Run Code Online (Sandbox Code Playgroud)

... ala,甚至无法编译。可能我必须使用合格的类名作为键而不是类/接口引用?但我想保持整洁的get函数设计,该函数将类型作为参数并返回仅采用类型的对象,而无需进行其他类型转换。

我是否有可能或应该更改此问题的方法?

Gam*_*a11 6

Class<T>用作Map密钥的问题经常出现,是一个相关的讨论。天真的方法Map<Class<T>, T>无法编译如下内容:

抽象的haxe.ds.Map没有@:to函数接受haxe.IMap <Class <Main.T>,Main.T>`

有几种解决此问题的方法:

  • 可以使用Type反射来获取类实例的全限定名称,然后将该名称用作a中的键Map<String, T>

    var map = new Map<String, Any>();
    var name = Type.getClassName(Main);
    map[name] = value;
    
    Run Code Online (Sandbox Code Playgroud)

    为了方便起见,您可能需要一个包装器来完成此任务,例如this ClassMap实现