使用通用扩展方法进行AutoMapper映射

时间:2015-04-22 09:28:46

标签: c# generics automapper

我想用通用扩展方法映射我的对象。

public class Customer    
{    
    public string FirstName { get; set; }    
    public string LastName { get; set; }    
    public string Email { get; set; }    
    public Address HomeAddress { get; set; }    
    public string GetFullName()    
    {  
        return string.Format(“{0} {1}”, FirstName, LastName);
    }    
}

这是viewmodel

public class CustomerListViewModel    
{    
    public string FullName { get; set; }
    public string Email { get; set; }    
    public string HomeAddressCountry { get; set; }    
}

所以我正在制作地图Mapper.CreateMap<Customer, CustomerListViewModel>();

我想创建一个扩展方法

public static class MapperHelper
{
    public static CustomerListViewModel ToViewModel(this Customer cust)
    {
        return AutoMapper.Mapper.Map<Customer, CustomerListViewModel>(cust);
    }
}

但我想制作通用的帮手:

public static class MapperHelper<TSource, TDest>
{
    public static TDest ToViewModel(this TSource cust)
    {
        return AutoMapper.Mapper.Map<TSource, TDest>(cust);
    }
}

给出错误:扩展方法只能在非通用的非嵌套静态类中声明

如果我不能创建泛型,我应该为所有映射创建帮助类。有什么方法可以解决吗?

3 个答案:

答案 0 :(得分:7)

比这些解决方案更好的是使用非通用Map方法:

public static class MapperHelper
{
    public static TDest MapTo<TDest>(this object src)
    {
        return (TDest)AutoMapper.Mapper.Map(src, src.GetType(), typeof(TDest));
    }
}

在您的代码中:

var model = customter.MapTo<CustomerViewModel>();

现在,您不需要泛型方法中的多余Source类型。

答案 1 :(得分:3)

你不能这样做吗?:

public static class MapperHelper
{
    public static TDest ToViewModel<TSource, TDest>(this TSource cust)
    {
       return AutoMapper.Mapper.Map<TSource, TDest>(cust);
    }
}

答案 2 :(得分:1)

您无法在通用中定义扩展方法,因为在调用它时无法指定类型参数!

public static class MapperHelper<TSource, TTarget>
{
  public static TTarget ToViewModel(this TSource source)
  {
    ...
  }
}

...

// this is no problem if we invoke our method like a
// static method:-
var viewModel = MapperHelper<MyModel, MyViewModel>.ToViewModel(model);

// but if we use the extension method syntax then how
// does the compiler know what TSource and TTarget are?:-
var viewModel = model.ToViewModel();

您必须改为使用方法: -

public static class MapperHelper
{
  public static TTarget ToViewModel<TSource, TTarget>(this TSource source)
  {
    ...
  }
}

...

var viewModel = model.ToViewModel<MyModel, MyViewModel>();
相关问题