1

.NET2.0 で動作する Automapper の代替案を誰かが推奨できるかどうか疑問に思います。

かなり複雑な構造を記述する dll があります。dll は Web サービスの両端にありますが、データが Web サービスを介して取得されると、名前空間によってオブジェクトの直接マッピングが妨げられるため、マッピング クラスのコーディングに頼る必要があります。

Automapper を組み込みましたが、思い通りに動作しますが、.NET2.0 では動作しません。クライアント ソフトウェアを実行する数百台のリモート マシンがあり、.NET2.0 に制限されているため、.NET2.0 を使用する必要があります。

どんな助けでも大歓迎です。

4

3 に答える 3

1

これは2.0なので、これは通常のwsdlベースのWebサービスであり、 (デフォルトXmlSerializerで使用するWCFとは異なり)を介して機能していると思います。DataContractSerializerこの場合、2回使用できるはずです。XmlSerializer

FromType fromObj = ...;
ToType toObj;
using(var ms = new MemoryStream())
{
    new XmlSerializer(typeof(FromType)).Serialize(ms, fromObj);
    ms.Position = 0;
    toObj = (ToType) new XmlSerializer(typeof(ToType)).Deserialize(ms);
}

おそらく理想的ではありませんが、タイプに互換性がある限り機能するはずです。

苛立たしいことに、WCFツールには、このような重複を避けるために、既存の型定義を再利用するためのサポートが組み込まれています。しかし、それは明らかに3.0です。

于 2013-01-04T11:06:11.387 に答える
0

構造の複雑さによっては、リフレクション使用して最初のオブジェクトのプロパティのリストを取得し、関連付けられた値を同じ名前の 2 番目のオブジェクト プロパティに設定することができます。

構造に単純なプロパティしかない場合は、効率的です。

于 2013-01-04T11:07:59.390 に答える
0

この場合、リフレクションはあなたの親友です。

以下は、プロパティコピー機の大まかな実装です。ターゲット タイプのインスタンスを新しく作成し、すべてのプロパティ値が設定されたソース インスタンスとともにこれに渡すだけです。

edit : Marc が指摘したように、これは単純なプロパティ マッピングに関してのみトリックを行います。一粒の塩でそれを取ります。

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace StackOverflow
{
    public static class ReflectionHelper
    {
        public static void CopyPropertyValues(object source, object target)
        {
            if (source == null) throw new ArgumentNullException("source");
            if (target == null) throw new ArgumentNullException("target");

            var sourceType = source.GetType();
            var targetType = target.GetType();
            var sourceProperties = sourceType.GetProperties();

            foreach (var sourceProperty in sourceProperties)
            {
                if (sourceProperty.CanRead)
                {
                    var targetProperties = targetType.GetProperties();

                    foreach (var targetProperty in targetProperties)
                    {
                        if (targetProperty.Name == sourceProperty.Name &&
                            targetProperty.PropertyType == sourceProperty.PropertyType)
                        {
                            if (targetProperty.CanWrite)
                            {
                                var value = sourceProperty.GetValue(source, null);

                                targetProperty.SetValue(target, value, null);
                            }

                            break;
                        }
                    }
                }
            }
        }
    }
}
于 2013-01-04T11:09:36.457 に答える