【发布时间】:2017-03-13 16:22:54
【问题描述】:
我需要创建一个映射(使用 AutoMapper),从所有从一个抽象类派生的 n 个类到一个契约类
例如:
public abstract class bar
{
public string Field1 {get; set;}
public someClass Field2 {get; set;}
}
public class foo1bar: bar
{
// members
}
public class foo2bar: bar
{
// members
}
public class barContract
{
public string Field1 {get; set;}
// this will use existing someClass.Description field
public string Field2Description {get; set;}
}
bar 类的实现是多种的,并且也可能会改变(更多将被添加)。由于 Automapper 无法映射到抽象类(因此构造函数 mapperConfiguration.CreateMap<bar, barContract>() 不正确),我想知道是否可以使用反射来查找所有“实现”条形类的类并“自动”映射它们
var type = typeof(bar);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p));
我有类型,我正在尝试调用 CreateMap。 由于类型现在是一个变量,我再次使用反射创建了一个泛型方法:
foreach (Type t in types)
{
mapperConfiguration.GetType().GetMethod("CreateMap")
.MakeGenericMethod(t, typeof(barContract))
.Invoke(mapperConfiguration, null);
}
问题是 CreateMap 不是从 mapperConfiguration 实例中提取的类型的成员 - 当我尝试按名称提取方法时,我得到空值。我看到它是在 IProfileExpression 中定义的,所以我试图从接口中提取方法:
typeof(IProfileExpression).GetMethod("CreateMap") 并且我得到 System.Reflection.AmbiguousMatchException - 这还不错,但更具体地说,在 GetMethod 中使用 System.Reflection.BindingFlags 我又得到了空值。
我做错了什么,或者如何解决映射问题?
【问题讨论】:
标签: c# reflection automapper