private void WriteEnumMethod(EnumMapping mapping)
{
string methodName = (string)MethodNames[mapping];
Writer.WriteLine();
string fullTypeName = mapping.TypeDesc.CSharpName;
if (mapping.IsSoap)
{
Writer.Write("void ");
Writer.Write(methodName);
Writer.WriteLine("(object e) {");
WriteLocalDecl(fullTypeName, "v", "e", mapping.TypeDesc.UseReflection);
}
else
{
Writer.Write("string ");
Writer.Write(methodName);
Writer.Write("(");
Writer.Write(mapping.TypeDesc.UseReflection ? "object" : fullTypeName);
Writer.WriteLine(" v) {");
}
Writer.Indent++;
Writer.WriteLine("string s = null;");
ConstantMapping[] constants = mapping.Constants;
if (constants.Length > 0)
{
Hashtable values = new Hashtable();
if (mapping.TypeDesc.UseReflection)
Writer.WriteLine("switch (" + RaCodeGen.GetStringForEnumLongValue("v", mapping.TypeDesc.UseReflection) + " ){");
else
Writer.WriteLine("switch (v) {");
Writer.Indent++;
for (int i = 0; i < constants.Length; i++)
{
ConstantMapping c = constants[i];
if (values[c.Value] == null)
{
WriteEnumCase(fullTypeName, c, mapping.TypeDesc.UseReflection);
Writer.Write("s = ");
WriteQuotedCSharpString(c.XmlName);
Writer.WriteLine("; break;");
values.Add(c.Value, c.Value);
}
}
if (mapping.IsFlags)
{
Writer.Write("default: s = FromEnum(");
Writer.Write(RaCodeGen.GetStringForEnumLongValue("v", mapping.TypeDesc.UseReflection));
Writer.Write(", new string[] {");
Writer.Indent++;
for (int i = 0; i < constants.Length; i++)
{
ConstantMapping c = constants[i];
if (i > 0)
Writer.WriteLine(", ");
WriteQuotedCSharpString(c.XmlName);
}
Writer.Write("}, new ");
Writer.Write(typeof(long).FullName);
Writer.Write("[] {");
for (int i = 0; i < constants.Length; i++)
{
ConstantMapping c = constants[i];
if (i > 0)
Writer.WriteLine(", ");
Writer.Write("(long)");
if (mapping.TypeDesc.UseReflection)
Writer.Write(c.Value.ToString(CultureInfo.InvariantCulture));
else
{
Writer.Write(fullTypeName);
Writer.Write(".@");
CodeIdentifier.CheckValidIdentifier(c.Name);
Writer.Write(c.Name);
}
}
Writer.Indent--;
Writer.Write("}, ");
WriteQuotedCSharpString(mapping.TypeDesc.FullName);
Writer.WriteLine("); break;");
}
else
{
Writer.Write("default: throw CreateInvalidEnumValueException(");
Writer.Write(RaCodeGen.GetStringForEnumLongValue("v", mapping.TypeDesc.UseReflection));
Writer.Write(".ToString(System.Globalization.CultureInfo.InvariantCulture), ");
WriteQuotedCSharpString(mapping.TypeDesc.FullName);
Writer.WriteLine(");");
}
Writer.Indent--;
Writer.WriteLine("}");
}
if (mapping.IsSoap)
{
Writer.Write("WriteXsiType(");
WriteQuotedCSharpString(mapping.TypeName);
Writer.Write(", ");
WriteQuotedCSharpString(mapping.Namespace);
Writer.WriteLine(");");
Writer.WriteLine("Writer.WriteString(s);");
}
else
{
Writer.WriteLine("return s;");
}
Writer.Indent--;
Writer.WriteLine("}");
}