给定源类型的属性名称,我需要获取目标属性的System.Reflection.PropertyInfo
。
PropertyInfo GetDestinationProperty<TSource, TDestination>(string sourceProperty)
{
var map = Mapper.FindTypeMapFor(typeof(TSource), typeof(TDestination));
// [magic]
return result;
}
我想要解决的问题是:我有一个MVC应用程序。在保存数据库上下文之前,有一个Entity Framework模型(源类型)提供自己的验证。我正在将这个EF模型映射到一个复杂的多层ViewModel。我需要将EF验证错误转换为MVC视图模型验证错误,以便它们在客户端上很好地显示。例如,如果我在“描述”属性上收到EF错误,我需要将其转换为映射属性“Info.Description”。
答案 0 :(得分:0)
这未经过测试,但您可以尝试这一点,假设您已经映射过它。
var map = Mapper.FindTypeMapFor<Source, Destination>();
foreach( var propertMap in map.GetPropertyMaps() )
{
var dest = propertMap.DestinationProperty.MemberInfo;
var source = propertMap.SourceMember;
}
propertMap.GetSourceValueResolvers()
答案 1 :(得分:0)
我制定了一个解决方案,但代码有点混乱。要在复杂映射中获取目标属性的路径,然后我可以将其归入ModelState以获取错误,我可以使用此代码:
public string GetDestinationPath(Type source, Type destination, string propertyName)
{
return GetDestinationPath(source, destination, propertyName, string.Empty);
}
public string GetDestinationPath(Type source, Type destination, string propertyName, string path)
{
var typeMap = Mapper.FindTypeMapFor(source, destination);
if (typeMap == null)
return null;
var maps = typeMap.GetPropertyMaps();
var exactMatch = maps.FirstOrDefault(m => m.SourceMember != null && m.SourceMember.Name == propertyName);
if (exactMatch != null)
return path + exactMatch.DestinationProperty.Name;
foreach (var map in maps)
{
if (map.SourceMember == null)
{
var result = GetDestinationPath(source, map.DestinationProperty.MemberType, propertyName, path + map.DestinationProperty.Name + ".");
if (result != null)
return result;
}
else
{
if (!(map.SourceMember is PropertyInfo))
continue;
var result = GetDestinationPath((map.SourceMember as PropertyInfo).PropertyType, map.DestinationProperty.MemberType, propertyName, path + map.DestinationProperty.Name);
if (result != null)
return result;
}
}
return null;
}
答案 2 :(得分:-1)
您可以使用简单的反射来实现这一目标。鉴于属性名称在源和目标中匹配,您可以编写以下代码:
PropertyInfo GetDestinationProperty<TSource, TDestination>(string sourceProperty)
{
var result = typeof(TDestination).GetProperty(sourceProperty);
return result;
}