0

列挙型を含むクライアント提供の 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 クライアントを作成すると、enum のコードは次のようになります。

/// <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:Auto" "/serializer:DataContractSerializer (ひどく失敗しました)" "/serializer:XmlSerializer" "/importXmlTypes"

しかし、結果は同じままです。

また、Xsd.exe を使用して、wsdl で参照されている xsds から c-sharp コード ファイルを作成しようとしましたが、結果は同じままです。

期待されることができる他の無料ツールはありますか?

どんな洞察も大歓迎です!

4

1 に答える 1

1

私は自分の問題を回避しました。このアイデアは、感謝と敬意を込めてここから取得されます。

実際の問題は、値 10 が与えられたときに Item10 を取得する方法でした。上記のリンクで引用されているソリューションからヒントを得て、次のメソッドを思いつきました。このメソッドは、XmlEnumAttribute に含まれる値を渡すと、enum 値を返します。 :

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;
    }

お役に立てれば!

于 2012-05-23T21:44:52.217 に答える