0

我有很多 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?

4

3 回答 3

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"
于 2013-07-09T18:44:35.763 回答
1

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

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

alert(MyEnum.ITEM1 | MyEnum.ITEM2); // shows 8
于 2013-07-09T18:26:15.183 回答
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"

如果您想混合和匹配不同的运算符,这将无济于事,尽管可能会使某些事情变得更复杂,但我不会打扰,因为即使这也可能不适用于实际情况。

于 2013-07-09T19:23:41.653 回答