我有一个界面
public interface ILocation {
double Longitude { get; set; }
double Latitude { get; set; }
}
和两个继承自此的类,都在不同的项目中(两个类都相同)
namespace Mvc {
[DataContract]
public class Location : ILocation {
[DataMember(Name = "longitude")
public double Longitude { get; set; }
[DataMember(Latitude = "latitude")
public double Latitude { get; set; }
}
}
namespace Storage {
public class Location : ILocation {
[BsonElement("longitude")
public double Longitude { get; set; }
[BsonElement("latitude")
public double Latitude { get; set; }
}
}
有一个包含此ILocation的类,ILocation是该类的属性,例如。
public interface IVehicle {
ILocation Location { get; set; }
}
namespace Mvc {
[DataContract]
public class Vehicle : IVehicle {
[DataMember(Name = "location")
public ILocation Location { get; set; }
}
}
namespace Storage {
public class Vehicle : IVehiche {
[BsonElement("location")
public ILocation Location { get; set; }
}
}
该类从一个项目传递到另一个项目(MVC稍后传递到存储层),并通过接口从MVC层传递到存储层。
我使用Automapper从界面映射到具体类,因此我可以在序列化时访问属性。
MapperConfiguration configuration = new MapperConfiguration(config => {
config.CreateMap<IVehicle, Storage.Vehicle>();
config.CreateMap<ILocation, Storage.Location>();
};
Mapper mapper = configuration.CreateMapper();
要从存储项目中的接口转换为具体类,我使用
Vehicle vehicle = mapper.Map<IVehicle, Storage.Vehicle>(data);
然后我将数据存储到我的存储(mongodb)中,并将车辆属性存储为“位置”字段名称,这是正确的。但是,Location的属性存储为'Longitude'和'Latitude'(大写的第一个字母),这是不正确的,因为我有两个属性存储为小写。
调试车辆变量时,我查看位置属性,它不是Storage.Location
类型,而是类型Mvc.Location
。但是我告诉Automapper将其映射到Storage.Location
。
在Automapper配置中,我尝试了config.CreateMap<IVehicle, Storage.Vehicle>().As<Storage.Vehicle>;
但仍然没有运气。
如何让Automapper将所有嵌套属性强制转换为指定的正确类型?我见过TypeConverters
但是我还没有看到一个通用的,我可以将源和目标类型传递给它,它会为我转换它,我似乎必须为每种类型指定一个,这将变得非常大在我正在建设的应用程序中。