मेरा मानना है कि XSD enumerations भावना है कि वे की जरूरत है और डॉन नहीं है में नेट enumerations से enumerations का एक और अधिक शुद्धतावादी कार्यान्वयन कर रहे हैं गणना किए गए नामों से जुड़े संख्यात्मक मूल्यों का समर्थन नहीं करते हैं। निस्संदेह जेनरेट कोड, .NET कोड होने के साथ, आंतरिक रूप से प्रत्येक नामित मान के साथ एक संख्यात्मक मान को जोड़ देगा, लेकिन यह एक कार्यान्वयन विवरण है जो एक्सएसडी मानक द्वारा परिभाषित गणना की प्रकृति के लिए निहित नहीं है। एक गणना के इस शुद्ध कार्यान्वयन में, मेरा मानना है कि प्रत्येक संख्याबद्ध नाम के साथ स्पष्ट संख्यात्मक मानों को जोड़ने का उचित तरीका एक अलग संग्रह/वर्ग को परिभाषित करना होगा जो संख्यात्मक मानों को संख्यात्मक मानों से जोड़ता है। या अतिरिक्त समेकित मानों को परिभाषित करें जो आपके द्वारा समर्थित संयुक्त मानों का प्रतिनिधित्व करते हैं (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:
अपने enum (के रूप में अपने उदाहरण है) इन दो परिवर्तन मेरी उदाहरण के लिए आवश्यक हैं 0 पर शुरू होता है:
अपडेट किया गया पूर्णांक कनवर्टर:
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)
क्या आप सी # कोड उत्पन्न करने के लिए अपना स्वयं का टूल लिख रहे हैं, या क्या कोई मानक उपकरण है जो एक्सएसडी से सी # कोड उत्पन्न करता है? – BlueMonkMN
अभी मैं xsd.exe का उपयोग कर रहा हूं। मेरे पास वास्तव में अपना खुद का टूल बनाने का समय नहीं है। –