JavaScript中的标志枚举和JSON

时间:2013-07-09 18:03:36

标签: javascript json enums asp.net-web-api

我有很多C#枚举,其中一些启用了标志。例如:

[Flags]
public enum MyEnum
{
  item1 = 0x0000,
  item2 = 0x0008
}

我用这样的东西将其克隆到JavaScript中:

my.namespace.MyEnum = {
  ITEM1: "item1",
  ITEM2: "item2"
}

我正在使用全局WebApi转换器将枚举映射到字符串,因为我更喜欢将字符串与REST API一起使用:

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter());

问题是,如果我创建一个使用此枚举的属性,它就不能使用按位操作(即my.namespace.MyEnum.ITEM1 | my.namespace.MyEnum.ITEM2)并获得所需的结果(“ item1,item2“)。

除了删除字符串转换器之外,是否有任何正确的方法为JavaScript中的标志枚举实现这种DataContract + JS API?

3 个答案:

答案 0 :(得分:2)

虽然我不是Javascript中的枚举也不是这些旗帜运营商的忠实粉丝,但我认为这可能与你想要的相当接近:

[my.namespace.MyEnum.ITEM1, my.namespace.MyEnum.ITEM2].join(", ") //=> "item1, item2"

var join = function() {
    return Array.prototype.join.call(arguments, ", ");
};

join(my.namespace.MyEnum.ITEM1, my.namespace.MyEnum.ITEM2); //=> "item1, item2"

答案 1 :(得分:1)

为什么不重复asp.net代码中的值?

MyEnum = {
  ITEM1: 0x0000,
  ITEM2: 0x0008
}

alert(MyEnum.ITEM1 | MyEnum.ITEM2); // shows 8

答案 2 :(得分:1)

这是另一种假设某些运算符重载的技术。这不是我实际推荐的那个,但它无论如何都是一个有趣的思想实验:

var Enum = function(name) {return function() {return name;};};

var my = {}; my.namespace = {};
my.namespace.MyEnum = {
    ITEM1: Enum("item1"),
    ITEM2: Enum("item2")
};

var Σ = function() {
    var queue = [];
    var valueOf = Function.prototype.valueOf;
    Function.prototype.valueOf = function() {
        queue.push(this());
    };
    return function() {
        Function.prototype.valueOf = valueOf;
        return queue.join(", ");
    };
};

Σ()(my.namespace.MyEnum.ITEM1 | my.namespace.MyEnum.ITEM2); //=> "item1, item2"

如果你想混合和匹配不同的运算符,那就无济于事了,虽然有可能做出更复杂的事情,但我也不会打扰,因为即使这可能不是真正的用途 - 世界局势。