3

オブジェクトを特定の型に変換するために使用できる次のメソッドがあります。

public static TTarget Convert<TTarget>(object source) where TTarget : new()
{
    var target = new TTarget();

    Type targetType = typeof (TTarget);
    foreach (PropertyInfo sourceProperty in source.GetType().GetProperties())
    {
        if (!sourceProperty.CanRead || (sourceProperty.GetIndexParameters().Length > 0))
            continue;

        PropertyInfo targetProperty = targetType.GetProperty(sourceProperty.Name);

        if ((targetProperty != null) && (targetProperty.CanWrite))
            targetProperty.SetValue(target, sourceProperty.GetValue(source, null), null);
    }
    return target;
}

プロパティが値型などである単純なクラスでは問題なく機能しますが、別のクラスにマップする必要がある複雑なプロパティでは、どうすればよいかわかりません。マッピングを静的プロパティに保存すると:

private static Dictionary<Type, Type> Mappings;

static TypeConverter()
{
    Mappings = new Dictionary<Type, Type>
        {
            {typeof (DbSpace), typeof (DmsSpace)},
            {typeof (DbDirectory), typeof (DmsDirectory)},
            {typeof (DbFile), typeof (DmsFile)}
        };
}

この情報を利用して複雑なプロパティを変換する方法を見つける方法が見つからないようです。上記のマッピングを使用して複雑なプロパティを変換するにはどうすればよいですか?

問題の核心は、オブジェクトnewしか持っていない場合、どのように呼び出すことができるかということです。Type

4

4 に答える 4

5

Activator.CreateInstance(type)、ここに私の答えが十分に「精巧」ではないと思う人のためのmsdnへのリンクがあります(必要に応じて短い答えに対して3つの反対票を獲得しました)...

AutoMapperも見ましたか?

于 2013-05-26T21:40:16.720 に答える
2

プロパティ名が一致する限り、多くのシリアライザー (JavaScriptSerializer、XmlSerializer、 Json.Netなど) を使用して、オブジェクトの「ディープ コンバート」を行うことができます。

JavaScriptSerializerを使用した例を示します

var class1 = new Class1() { Property = "a", SubProperty = new SubClass1() { SubProperty = "b" } };
var class2 = Convert<Class2>(class1);


public static TTarget Convert<TTarget>(object source) where TTarget : new()
{
    var ser = new JavaScriptSerializer();
    var json = ser.Serialize(source);
    return ser.Deserialize<TTarget>(json);
}

.

public class Class1
{
    public string Property { get; set; }
    public SubClass1 SubProperty { get; set; }
}

public class SubClass1
{
    public string SubProperty { get; set; }
}


public class Class2
{
    public string Property { get; set; }
    public SubClass2 SubProperty { get; set; }
}

public class SubClass2
{
    public string SubProperty { get; set; }
}
于 2013-05-26T22:24:27.170 に答える
1

手動で行うのではなく、 AutoMapperを使用してください。

于 2013-05-26T21:51:00.090 に答える