0

自分がやろうとしていること(申し訳ありませんが、newb)を説明する方法すらわかりませんが、正しく行う方法がわからないためにコードを複製することは、私のリストの上位にはありません。何か助けてください?

オリジナルの非ジェネリックメソッド:

    public static string SerializetaUpdateCreateItemRcd(IVItemMasterType o)
    {
        eConnectType eConnect = new eConnectType();

        IVItemMasterType[] myMaster = { o };

        // Populate the eConnectType object with the schema object
        eConnect.IVItemMasterType = myMaster;

        return MemoryStreamSerializer(eConnect);
    }

ジェネリックで、非常に近く、型付きプロパティ(?)の設定で失われた私の試み:

    public static string Serialize<T>(T o) where T : eConnectType
    {
        eConnectType eConnect = new eConnectType();

        T[] myMaster = { o };

        // Populate the eConnectType object with the schema object
        eConnect.? = myMaster;

        return MemoryStreamSerializer(eConnect);
    }

アップデート:

申し訳ありませんが、これはすべてアーキテクチャの問題かもしれませんが、約166の可能な組み合わせがあり、それぞれに対してこの1つのステップをコーディングするのはばかげているようです。私はそれだけをしなければならないかもしれません...

eConnectへのMSDocリファレンス:http: //msdn.microsoft.com/en-us/library/ff623781.aspx

シリアル化を呼び出すサンプルコード:

    IVItemMasterType o = new IVItemMasterType();

    o.eConnectProcessInfo = null;
    o.taCreateInternetAddresses_Items = null;
    o.taCreateItemVendors_Items = null;
    o.taCreateKitItemRcd_Items = null;
    o.taItemSite_Items = null;
    o.taIVCreateItemPriceListHeader = null;
    o.taIVCreateItemPriceListLine_Items = null;
    o.taRequesterTrxDisabler_Items = null;
    o.taUpdateCreateItemCurrencyRcd_Items = null;
    o.taUpdateCreateItemRcd = eConnectHelper.taUpdateCreateItemRcdFactory(eItem);

    // Serialize into string & add to list
    List<string> sList = new List<string>();             
    sList.Add(eConnectHelper.Serialize(o));

    // Submit list to eConnect
    eCreateEntity(sList);

SerializeMemoryStreamコード:

    public static string MemoryStreamSerializer(eConnectType e)
    {
        XmlSerializer serializer = new XmlSerializer(e.GetType());

        using (var memoryStream = new MemoryStream())
        {
            serializer.Serialize(memoryStream, e);
            memoryStream.Position = 0;

            // Use memory streamed XML document to create a string representation of the object
            XmlDocument xmldoc = new XmlDocument();
            xmldoc.Load(memoryStream);
            memoryStream.Close();
            string sDocument = xmldoc.OuterXml;

            return sDocument;
        }
    }

アップデート2:

お二人に感謝します。その上で寝た後、私は自分のアーキテクチャのエラーに気づきました。どちらの方法でもeConnectオブジェクトをビルドする必要があり、前のメソッド呼び出しですでにサブタイプオブジェクトをビルドしているので、タイプしたシリアル化コードをバックトラックしてメインの呼び出しメソッドに移動しました。

私はリフレクションを試しましたが、コンパイルして実行しましたが、私が知る限り、すべてのオブジェクトにデータが入力されているにもかかわらず、何らかの理由でObjectReference/NullReferenceを除外しました。

これが私がそれをどのように使っていたかです:

    public static string Serialize<T>(T o)
    {
        eConnectType e = new eConnectType();

        T[] myMaster = { o };

        // Populate the eConnectType object with the schema object
        typeof(eConnectType).GetProperty(typeof(T).Name).SetValue(e, myMaster, null);

        return MemoryStreamSerializer(e);
    }
4

3 に答える 3

1

ここでの問題は、ジェネリック型パラメーターがプロパティ名を制御できないことです。eConnectと呼ばれるプロパティを持っているという事実IViewMasterTypeは、ジェネリック型システムに関する限り、完全に偶然です。

あなたはeConnectType<T>プロパティを持つことができますpublic T[] SomePropertyName { get; set; }。つまり、型指定されたプロパティ名をその型に関連付けることはできません。次に、これを行います。

public static string Serialize<T>(T o)
{ 
    eConnectType<T> eConnect = new eConnectType<T>(); 

    T[] myMaster = { o }; 

    // Populate the eConnectType object with the schema object 
    eConnect.SomePropertyName = myMaster; 

    return MemoryStreamSerializer(eConnect); 
} 

しかし、コードをもっと見なければ、これが役立つかどうかを判断するのは困難です。

編集

あなたの更新に照らして、私はリフレクションを使用するというフランシスの提案に傾倒します。反射は遅くなりますが、私の経験では、実際に最適化する必要があるほど遅くなることはありませんでした。

于 2011-11-15T19:47:35.713 に答える
1

ジェネリック型と同じ名前のプロパティに本当にアクセスする必要がある場合は、Reflectionを使用する必要があります。

typeof(eConnectType).GetProperty(typeof(T).Name).SetValue(eConnect, myMaster, null);
于 2011-11-15T20:21:28.830 に答える
1

このeConnecTypeクラスのメンバーはプロパティではなく「フィールド」であるため、注意深くデバッグした後、この「getProperties」は「null」参照を返し続けました...これが修正です...

public static string Serialize<T>(T o)
    {
        eConnectType e = new eConnectType();
        T[] myMaster = { o };

        // Populate the eConnectType object with the schema object 
        typeof(eConnectType).GetField(typeof(T).Name).SetValue(e, myMaster);
        return MemoryStreamSerializer(e);
    }
于 2012-02-22T19:04:15.727 に答える