我有一个客户端提供的包含枚举的wsdl文件:
<xsd:simpleType name="OurEnum">
<xsd:annotation>
<xsd:appinfo>
<i:Base i:namespace="http://x.com/y/structures/2.0" i:name="Object"/>
</xsd:appinfo>
</xsd:annotation>
<xsd:restriction base="xsd:token">
<xsd:enumeration value="0"/>
<xsd:enumeration value="1"/>
<xsd:enumeration value="2"/>
<xsd:enumeration value="3"/>
<xsd:enumeration value="10"/>
</xsd:restriction>
使用Svcutil创建WCF客户端,枚举代码如下所示:
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.233")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://x.com/y/z/2.0")]
public enum OurEnum
{
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("0")]
Item0,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("1")]
Item1,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("10")]
Item10,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("2")]
Item2,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("3")]
Item3,
}
创建枚举值为Item0,Item1,Item10非常烦人。应该如何使用Svcutil,以便生成的代码如下所示:
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.233")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://x.com/y/z/2.0")]
public enum OurEnum
{
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("0")]
0,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("1")]
1,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("10")]
10,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("2")]
2,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("3")]
3,
}
我已经尝试过使用Svcutil的以下序列化选项:
“/串行器:自动” “/ serializer:DataContractSerializer(失败严重)” “/串行器:XmlSerializer的” “/ importXmlTypes”
但结果仍然相同。
我也尝试过使用Xsd.exe从wsdl中引用的xsds创建c-sharp代码文件,但结果仍然保持不变。
那里有没有其他免费工具,可以做到预期吗?
非常感谢任何见解!
答案 0 :(得分:1)
我已经解决了我的问题。这个想法来自here,并给予了应有的感谢和敬意。
实际问题是如何获取Item10,当给定值为10.从上面链接引用的解决方案中获取提示时,我想出了以下方法,当传递XmlEnumAttribute中包含的值时,将返回枚举值:
private static T GetEnumValueFromXmlAttrName<T>(string attribVal)
{
T val = default(T);
if (typeof(T).BaseType.FullName.Equals("System.Enum"))
{
FieldInfo[] fields = typeof(T).GetFields();
foreach (FieldInfo field in fields)
{
object[] attribs = field.GetCustomAttributes(typeof(XmlEnumAttribute), false);
foreach (object attr in attribs)
{
if ((attr as XmlEnumAttribute).Name.Equals(attribVal))
{
val = (T)field.GetValue(null);
return val;
}
}
}
}
else
throw new Exception("The supplied type is not an Enum.");
return val;
}
希望这有帮助!