プロジェクトで 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
AutoMapper 4.2. がサポートされるようになりました ダイナミック/エクスパンド/辞書マッピング
この機能を使用すると、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);
試してくださいSlapper.AutoMapperhttps://github.com/randyburden/Slapper.AutoMapper
Slapper.AutoMapperは、動的データを静的型にマッピングします
dynamic
とDictionary<A, B>
の両方で機能します。
以下は、上記のURLから取得した例で、Dictionaryとの連携がいかに簡単かを示しています。
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" );
}
使用するフレームワークが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
メソッドを使用して、あらゆる種類の複雑なマッピングを作成できます。
単一オブジェクト:
Mapper.Map<Product>(dynamicProduct);
リスト:
Mapper.Map<List<Product>>(dynamicListOfProducts);
例(71行目): https://github.com/AutoMapper/AutoMapper/blob/master/src/UnitTests/DynamicMapping.cs