46

プロジェクトでhttps://github.com/robconery/massiveを使い始めましたが、動的から静的タイプへのマッピングをサポートできるマッピングツールはありますか?

以前にAutoMapperを使用しましたが、AutoMapperはこれをサポートしていますか?

AutoMapperのDynamicMap関数を知っていますが、この関数は、最初にマップを作成せずにマップを実行するためのものだと思います。以下の私の例では、機能しません。

dynamic curUser = users.GetSingleUser(UserID);   
var retUser = Mapper.DynamicMap<UserModel>(curUser);
users.GetSingleUser(UserID); // returns a dynamic object
4

4 に答える 4

71

AutoMapper 4.2.0は、動的/拡張/辞書マッピングをサポートするようになりました

この機能を使用すると、expandoオブジェクトを静的タイプにマップできます。

dynamic CurUser = _users.GetSingleUser(UserID);   
var config = new MapperConfiguration(cfg => { });
var mapper = config.CreateMapper();

var retUser = mapper.Map<UserModel>(CurUser);

AutoMapperの古いバージョンはこれをサポートしていません(Massiveは内部でどのプロパティを提供しないかを使用します) 。マッピング構成を作成せずにマッピングするの ExpandoObjectは正しいことです。Mapper.DynamicMap

実際、単純なマッピングが必要な場合は、マッパーを自分で作成するのは難しくありません。

public static class DynamicToStatic
{
    public static T ToStatic<T>(object expando)
    {
        var entity = Activator.CreateInstance<T>();

        //ExpandoObject implements dictionary
        var properties = expando as IDictionary<string, object>; 

        if (properties == null)
            return entity;

        foreach (var entry in properties)
        {
            var propertyInfo = entity.GetType().GetProperty(entry.Key);
            if(propertyInfo!=null)
                propertyInfo.SetValue(entity, entry.Value, null);
        }
        return entity;
    }
}

dynamic CurUser = _users.GetSingleUser(UserID);   
var retUser = DynamicToStatic.ToStatic<UserModel>(CurUser);
于 2011-10-15T14:25:14.907 に答える
17

Slapper.AutoMapperhttps : //github.com/randyburden/Slapper.AutoMapperをお試しください

Slapper.AutoMapperは、動的データを静的タイプにマップします

それは両方のために働きます、dynamicそしてDictionary<A, B>それは素晴らしいです。

これは、Dictionaryでどれほど簡単に機能するかを示す例(上記のURLから取得)です。

public class Person
{
    public int Id;
    public string FirstName;
    public string LastName;
}

[Test]
public void CanMapMatchingFieldNamesWithEase()
{
    // Arrange
    var dictionary = new Dictionary<string, object>
                            {
                                { "Id", 1 },
                                { "FirstName", "Clark" },
                                { "LastName", "Kent" }
                            };

    // Act
    var person = Slapper.AutoMapper.Map<Person>( dictionary );

    // Assert
    Assert.NotNull( person );
    Assert.That( person.Id == 1 );
    Assert.That( person.FirstName == "Clark" );
    Assert.That( person.LastName == "Kent" );
}
于 2013-03-06T02:41:18.870 に答える
3

使用するフレームワークがリターンであると仮定するとExpandoObject、AutoMapperを使用してある種の動的マッピングを実現できます。

Mapper.CreateMap<ExpandoObject, UserModel>()
    .ForAllMembers((options) => options.ResolveUsing((resolution) =>
        {
            var dictionary =  (IDictionary<string, object>) resolution.Context.SourceValue;
            return dictionary[resolution.Context.MemberName];
        }));
...
dynamic CurUser = _users.GetSingleUser(UserID);   
var retUser = Mapper.Map<UserModel>(CurUser);

ConstructUsingメソッドを使用して、あらゆる種類の複雑なマッピングを作成できます。

于 2015-07-03T18:00:54.757 に答える
0

単一のオブジェクト:

Mapper.Map<Product>(dynamicProduct);

リスト:

Mapper.Map<List<Product>>(dynamicListOfProducts);

例(71行目):https ://github.com/AutoMapper/AutoMapper/blob/master/src/UnitTests/DynamicMapping.cs

于 2018-01-30T14:44:56.250 に答える