动态声明要作为参数传递的类型... c#

时间:2013-11-07 21:57:30

标签: c# automapper

我在VS2012中使用AutoMapper。这是我使用的autoMapper方法的签名:

         public static IMappingExpression<TSource, TDestination> CreateMap<TSource, TDestination>();

它接受两种类型的参数,映射类型#1到类型#2和返回类型#2。我有一堆类都继承自同一个源。如果我尝试创建AutoMap实例,我必须执行以下操作:

            Mapper.CreateMap<ClassOne, ClassTwo>();  
            ClassOne one = new ClassOne{Name="One};
            ClassTwo two = Mapper.Map<ClassOne, ClassTwo>(one);

这会将ClassOne对象中的所有字段“映射”到我的ClassTwo对象(是的ClassTwo有一些ClassOne字段)。我想设置一个函数,它将调用Mapper函数将一个对象映射到另一个对象,而不是使用相同代码的众多函数只更改2个对象im映射。我可以对我的对象执行GetType()并以字符串格式提供我需要的类型:

         ClassOne one = new ClassOne();
         Type t = one.GetType();
         var type = t.FullName; //type is now "Generic.Collection.ClassOne"
         Mapper.CreateMap<type, ClassTwo>();//this will not compile
         Mapper.CreateMap<one.GetType(), ClassTwo>();//neither will this

但是我无法将字符串传递给Mapper函数。如何动态声明类型?

我正在使用AutoMapper作为我想要声明和使用类型的示例。我有其他功能可以做同样的事情。所以我的问题是如何动态声明一个类型? - 不是如何使用AutoMapper。

2 个答案:

答案 0 :(得分:3)

CreateMap方法还有另一个非泛型的重载:

Mapper.CreateMap(t, typeof(ClassTwo));

答案 1 :(得分:1)

你错误地使用了自动播放器。

Automapper应在应用程序引导时配置,以设置Mapper.CreateMap的类型注册表,其中T1和T2是类型,NOT实例。您可以使用字符串重载将两种类型映射到一起,这样就可以了。自动播放器注册表不是线程安全的,因此请确保在应用程序开始时将其连接起来,懒惰/当您遇到正在使用的类型时。

配置了automapper后,只需在常规代码中使用Mapper.Map。