C# 是否允许使用AutoMapper或类似工具映射动态类型?

C# 是否允许使用AutoMapper或类似工具映射动态类型?,c#,automapper,massive,C#,Automapper,Massive,我已经开始用于一个项目,我想知道是否有任何映射工具可以支持动态到静态类型映射 我以前用过AutoMapper,AutoMapper支持吗 我知道AutoMapper的DynamicMap函数,但是我相信该函数用于运行地图,而无需先创建地图。在我下面的例子中,它不起作用 dynamic curUser = users.GetSingleUser(UserID); var retUser = Mapper.DynamicMap<UserModel>(curUser); users.

我已经开始用于一个项目,我想知道是否有任何映射工具可以支持动态到静态类型映射

我以前用过AutoMapper,AutoMapper支持吗

我知道AutoMapper的DynamicMap函数,但是我相信该函数用于运行地图,而无需先创建地图。在我下面的例子中,它不起作用

dynamic curUser = users.GetSingleUser(UserID);   
var retUser = Mapper.DynamicMap<UserModel>(curUser);
users.GetSingleUser(UserID); // returns a dynamic object
dynamic curUser=users.GetSingleUser(UserID);
var retUser=Mapper.DynamicMap(curUser);
users.GetSingleUser(UserID);//返回一个动态对象
现在支持

使用此功能,您可以将expando对象映射到静态类型:

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

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

试试Slapper.AutoMapper

Slapper.AutoMapper将动态数据映射到静态类型

它适用于
动态
字典
,非常棒

下面是一个示例(取自上面的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" );
}
公共类人物
{
公共int Id;
公共字符串名;
公共字符串LastName;
}
[测试]
public void canmappachingfieldnameswithease()
{
//安排
var字典=新字典
{
{“Id”,1},
{“名字”,“克拉克”},
{“姓氏”,“肯特”}
};
//表演
var person=Slapper.AutoMapper.Map(字典);
//断言
Assert.NotNull(人);
Assert.That(person.Id==1);
断言(person.FirstName==“Clark”);
断言(person.LastName==“Kent”);
}

假设框架使用returns
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);
Mapper.CreateMap()
.ForAllMembers((选项)=>options.ResolveUsing((分辨率)=>
{
var dictionary=(IDictionary)resolution.Context.SourceValue;
返回字典[resolution.Context.MemberName];
}));
...
动态CurUser=\u users.GetSingleUser(UserID);
var retUser=Mapper.Map(CurUser);
您可以使用
ConstructUsing
方法创建任何类型的复杂映射。

单个对象:

Mapper.Map<Product>(dynamicProduct);
Mapper.Map(dynamicProduct);
名单:

Mapper.Map(dynamicListOfProducts);

示例(第71行):

今天下午+1,我已经为此挣扎了几个小时。Thanks@nemesv“[…]ExpandoObject,它不提供它拥有的属性)[…]”这适用于深层层次结构,但啊。。
惯例是一个令人讨厌的东西(不,我不是指你的方法的名称。我的意思是,这是一个库,它可以处理类结构中的深层层次结构(与你答案中的示例不同的复杂类结构),与公认的答案不同,但它需要某种“命名约定”我同意如果子动态类型是父对象的属性,那么你就可以得到Foo.Bar.Baz而不是Foo\u Bar\u Baz…@nawfal可以自定义“\u”约定,例如
Slapper.AutoMapper.Configuration.IdentifierConventions.Add(type=>type.Name+“_Id”);
,请参阅。有关更完整的答案,请参阅。@LiamB,“AutoMapper是否支持此功能?”-您是指具有相同/相似名称的属性之间的自动映射?还是您的映射更复杂?@LeonidVasilyev抱歉-我不确定,这个问题已经问了4年了!:@LiamB,哇,确实是:)我不明白。。。在我看来,上述法规是犯罪行为。如果我看到dynamics以这种方式使用,我会对上述程序员的能力和所用库的质量产生严重的疑问。我意识到问题中可能有一些特定领域的知识不清楚,但仍然。。。。C#!=JavaScript。为什么任何ORM都会返回动态?讨厌!
Mapper.Map<Product>(dynamicProduct);
Mapper.Map<List<Product>>(dynamicListOfProducts);