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