首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用AutoMapper编写通用Resolver?

用AutoMapper编写通用Resolver?
EN

Stack Overflow用户
提问于 2013-11-04 17:10:28
回答 1查看 3K关注 0票数 1

我想编写一个通用的AutoMapper的Resolver,用于更改模型的文件路径。

如果没有泛型Resolver,我编写了以下解析器:

例如:

代码语言:javascript
复制
public class UserPhotoPathResolver : ValueResolver<User, string>
{
    protected override string ResolveCore(User source)
    {
        var url = new UrlHelper(HttpContext.Current.Request.RequestContext);
        return url.Content(string.IsNullOrWhiteSpace(source.PhotoPath) 
            ? StaticVariables.DefaultUserImagePath 
            : source.PhotoPath);
    }
}

现在,我编写了以下Resolver:

代码语言:javascript
复制
public class FilePathResolver<T, TProperty> : ValueResolver<T, string> where T : class
{
    private readonly Expression<Func<T, TProperty>> _propertyExpression;

    public FilePathResolver(Expression<Func<T, TProperty>> propertyExpression)
    {
        _propertyExpression = propertyExpression;
    }

    protected override string ResolveCore(T source)
    {
        Type typeOfEntity = typeof(T);

        MemberExpression member = _propertyExpression.Body as MemberExpression;
        if (member == null)
            throw new ArgumentException(string.Format("Expression '{0}' refers to a method, not a property.", _propertyExpression));

        PropertyInfo propInfo = member.Member as PropertyInfo;
        if (propInfo == null)
            throw new ArgumentException(string.Format("Expression '{0}' refers to a field, not a property.", _propertyExpression));

        if (typeOfEntity != propInfo.ReflectedType && !typeOfEntity.IsSubclassOf(propInfo.ReflectedType))
            throw new ArgumentException(string.Format("Expresion '{0}' refers to a property that is not from type {1}.", _propertyExpression, typeOfEntity));

        string filePath = Convert.ToString(ModelHelpers.GetStringPropertyValue(source, propInfo.Name));
        return string.IsNullOrWhiteSpace(filePath)
            ? string.Empty
            : UrlHelpers.GetUrlHelperInstance().Content(filePath);
    }
}

public static object GetStringPropertyValue(object src, string propertyName)
{
    return src.GetType().GetProperty(propertyName).GetValue(src, null);
}

public static TProperty GetValue<T, TProperty>(T obj, Expression<Func<T, TProperty>> expression) where T : class
{
    if (obj == null) return default(TProperty);
    Func<T, TProperty> func = expression.Compile();
    return func(obj);
}

但是FilePathResolver返回这个字符串MyApp.Classes.Helpers.FilePathResolver%602[MyApp.DAL.ModelName,System.String]

我将此解析器用作以下内容:

代码语言:javascript
复制
Mapper.CreateMap<EntityClass, EntityClassModel>()
    .ForMember(m => m.ResolvedLogoPath, opt => opt.ResolveUsing(m => new FilePathResolver<EntityClass, string>(p => p.LogoPath)));

我该怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-06 08:05:04

问题是使用了错误的ResolveUsing方法重载。

但你需要下一个。

您可以通过以下方式更改映射配置来修复它。

代码语言:javascript
复制
Mapper.CreateMap<EntityClass, EntityClassModel>()
    .ForMember(m => m.ResolvedLogoPath, 
        opt => opt.ResolveUsing<FilePathResolver<EntityClass, string>>()
        .ConstructedBy(() => new FilePathResolver<EntityClass, string>(p => p.LogoPath)));

甚至像这样:

代码语言:javascript
复制
Mapper.CreateMap<EntityClass, EntityClassModel>()
  .ForMember(m => m.ResolvedLogoPath, 
    opt => opt.ResolveUsing(new FilePathResolver<EntityClass, string>(p => p.LogoPath)));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19773114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档