Reputation: 6875
I want to map my objects with generic extension methods.
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);
}
}
And this is viewmodel
public class CustomerListViewModel
{
public string FullName { get; set; }
public string Email { get; set; }
public string HomeAddressCountry { get; set; }
}
So I am creating map, Mapper.CreateMap<Customer, CustomerListViewModel>();
And I want to create an extension method
public static class MapperHelper
{
public static CustomerListViewModel ToViewModel(this Customer cust)
{
return AutoMapper.Mapper.Map<Customer, CustomerListViewModel>(cust);
}
}
But I want to make generic this helper:
public static class MapperHelper<TSource, TDest>
{
public static TDest ToViewModel(this TSource cust)
{
return AutoMapper.Mapper.Map<TSource, TDest>(cust);
}
}
Gives error: Extension method can only be declared in non-generic, non-nested static class
If I can not make generic, I should create helper class for all mapping. Is there any way to solution?
Upvotes: 7
Views: 11636
Reputation: 26785
Even better than these solutions is to use the non-generic Map method:
public static class MapperHelper
{
public static TDest MapTo<TDest>(this object src)
{
return (TDest)AutoMapper.Mapper.Map(src, src.GetType(), typeof(TDest));
}
}
In your code:
var model = customter.MapTo<CustomerViewModel>();
Now you don't need the superfluous Source type in your generic method.
Upvotes: 11
Reputation: 19210
You can't define extension methods in a generic class because there would be no way for you to specify the type parameters when you invoke it!
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();
You have to make the method generic instead:-
public static class MapperHelper
{
public static TTarget ToViewModel<TSource, TTarget>(this TSource source)
{
...
}
}
...
var viewModel = model.ToViewModel<MyModel, MyViewModel>();
Upvotes: 1
Reputation: 31249
Can't you just do this?:
public static class MapperHelper
{
public static TDest ToViewModel<TSource, TDest>(this TSource cust)
{
return AutoMapper.Mapper.Map<TSource, TDest>(cust);
}
}
Upvotes: 3