相信XSD枚舉是一個更純粹的執行枚舉比在某種意義上說,他們不需要和唐.NET枚舉不支持與枚舉名稱關聯的數字值。當然,生成的代碼(即.NET代碼)將在內部將數值與每個命名值相關聯,但這是一個實現細節,並非由XSD標準定義的枚舉性質所固有的。在這個純粹的枚舉實現中,我認爲將顯式數值與每個枚舉名稱相關聯的正確方法是定義一個將枚舉值鏈接到數值的單獨集合/類。或者定義表示您支持的組合值(NewInstallOrModify)的其他枚舉值。
編輯:
這裏是一個什麼樣的轉換器可能看起來像一個樣本。
// Generated code
public enum SetupTypeEnum
{
None,
NewInstall,
Modify,
Upgrade,
Uninstall
}
// End generated code
public struct IntMappedEnum<T> where T : struct
{
public readonly int originalValue;
public IntMappedEnum(T value)
{
originalValue = (int)Enum.ToObject(typeof(T), value);
}
public IntMappedEnum(int originalValue)
{
this.originalValue = originalValue;
}
public static implicit operator int(IntMappedEnum<T> value)
{
return 1 << value.originalValue;
}
public static implicit operator IntMappedEnum<T>(T value)
{
return new IntMappedEnum<T>(value);
}
public static implicit operator IntMappedEnum<T>(int value)
{
int log;
for (log = 0; value > 1; value >>= 1)
log++;
return new IntMappedEnum<T>(log);
}
public static explicit operator T(IntMappedEnum<T> value)
{
T result;
Enum.TryParse<T>(value.originalValue.ToString(), out result);
return result;
}
}
class Program
{
static void Main(string[] args)
{
SetupTypeEnum s = SetupTypeEnum.Uninstall;
IntMappedEnum<SetupTypeEnum> c = s;
int n = c;
IntMappedEnum<SetupTypeEnum> c1 = n;
SetupTypeEnum s1 = (SetupTypeEnum)c1;
Console.WriteLine("{0} => {1} => {2}", s, n, s1);
}
}
編輯2:
如果你的枚舉從0開始(如你的例子一樣)這兩個變化是必要的,我的例子:
更新INT轉換器:
public static implicit operator int(IntMappedEnum<T> value)
{
return (value.originalValue == 0)?0:1 << (value.originalValue - 1);
}
int log
後的行應該是:
for (log = 0; value > 0; value >>= 1)
你正在編寫自己的工具來生成C#代碼,還是有一些標準的工具從XSD生成C#代碼? – BlueMonkMN
現在我正在使用xsd.exe。我真的沒有時間去創建自己的工具。 –