2013-07-09 24 views
0

我有许多C#枚举,其中一些标记已启用。例如:JavaScript中的枚举和JSON标记

[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)和得到d esired结果(“item1,item2”)。

除了删除字符串转换器,是否有任何适当的方式来实现这种DataContract + JS API的旗帜enum在JavaScript中?

回答

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" 
+0

不妨使用[] .toString(),在你的自定义方法中额外的空间对我们来说没有什么作用...... – dandavis

+0

@dandavis:当然,你可以,但我宁愿要比这更明确。而原来的空间。 –

1

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

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

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

原因是这意味着你需要维护客户端JS上的枚举(相应的数字)的逻辑,这是不受欢迎的。相反,使用我的字符串方法,如果服务器决定改变它编号方案,JS仍然没有受到影响和遗忘,这对维护来说更好。 – automaton

+0

@automaton:嗯。枚举使用数字,因此是单词的“num”部分。你可以连接标记并搜索整体的成员资格,但这并不能让事情变得更简单。编写“x.ITEM1”与“item1”没有语义或性能优势,事实上,“item1”在js中更短,更快,更易读。 – dandavis

+0

@dandavis:同意,这就是为什么我主要避免JS中的枚举和大多数其他形式的字符串常量。 –

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" 

它不会帮助,如果你想混合和匹配不同的运营商,虽然有可能使更复杂的东西,我不会打扰,因为即使这可能不适用于现实世界的情况。