2016-06-02 3 views
0

Я хотел бы создать анонимную функцию, которая принимает источник и позволяет мне указать место назначения, у меня есть некоторые проблемы с ним. Он жалуется, что мой пункт назначения - это «Тип», который имеет смысл, но я не уверен, как его исправить.Анонимная функция с AutoMapper

Вот функция:

public TDest ReadService<TSrc,TDest>(Func<IWebApiServiceResponse<TSrc>> func, TDest dest) 
    { 
     // i will be doing other functionality in here, error logging, etc 
     return Mapper.Map(func(), dest); 
    } 

Вот как я называю это:

var data = ReadService(() => Services.CServices.CUsers(), typeof(CustomViewModel)); 

Я ожидаю данных к типу CustomViewModel.

Что я здесь делаю неправильно?

ответ

1

Это не полностью ясно, что вы пытаетесь сделать, но я подозреваю, что вам нужно пройти сам вид модели вместо типа модель вида:

var data = ReadService(() => Services.CServices.CUsers(), new CustomViewModel()); 

или пусть AutoMapper создать для вас:

public TDest ReadService<TSrc,TDest>(Func<IWebApiServiceResponse<TSrc>> func) 
{ 
    // i will be doing other functionality in here, error logging, etc 
    return Mapper.Map<IWebApiServiceResponse<TSrc>, TDest>(func()); 
} 

Однако следует отметить, что общий параметр не может быть выведено из возвращаемого типа, так что вам придется указать его при вызове метода:

var data = ReadService<CUser,CustomViewModel>(() => Services.CServices.CUsers()); 
1

Я думаю, что вы путаете некоторые понятия здесь:

Когда вы делаете вызов ReadService(() => Services.CServices.CUsers(), typeof(CustomViewModel)), общий тип TDest будет System.Type, так вот что typeof возвратов.

Так возвращаемый тип ReadService является System.Type и вы пытаетесь карту от к System.Type, не CustomViewModel.

Чтобы исправить это, вы можете сделать что-то вроде этого:

public TDest ReadService<TSrc, TDest>(Func<IWebApiServiceResponse<TSrc>> func) 
{ 
    var type = typeof(TDest); //If you need the System.Type of TDest 

    ... 
    return Mapper.Map<TDest>(func()); 
} 

var data = ReadService</*source type*/, CustomViewModel>(() => Services.CServices.CUsers());