2013-07-09 95 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" 

它不會幫助,如果你想混合和匹配不同的運營商,雖然有可能使更復雜的東西,我不會打擾,因爲即使這可能不適用於現實世界的情況。