Я попытался закодировать функцию, используя refelecion, для преобразования функции Func‹ TSource, bool> в Func‹ TTarget, bool>, но безуспешно.
Это то, что я сделал:
static Func<TTarget, bool> Convert<TSource, TTarget>(Func<TSource, bool> func)
{
var result = func;
result.GetType().GenericTypeArguments[1] = typeof(TTarget);
return (Func<TTarget, bool>)result;
}
Редактировать:
В моем случае у меня есть объект User как DTO, и я не хочу делиться этим DTO с другими слоями, он будет виден только моему сервисному агенту. Затем есть еще один уровень, который имеет доступ к моему сервисному агенту, в на этом уровне у меня есть еще один объект, представляющий пользователя, скажем, «CustomUser». Допустим, разница между «Пользователь» и «CutomUser» в том, что первый имеет свойство «Пароль», а второй — без него.
В моем сервисном агенте у меня есть функция GetUser( Func‹ User, bool> func ), но на моем стороннем уровне я не вижу объект User, однако объект CustomUser виден Итак, на моем сервисном агентском уровне я хочу создать еще одну функцию GetUser ( Func‹ CustomUser, bool >), которая будет видна другим слоям, и эта функция напрямую вызывает первую скрытую функцию GetUser(Func‹ User, bool>) с помощью преобразователя
public CustomUser GetUser(Func<CustomUser, bool> func) {
// var myUser = this.GetUser(ConvertFunc( func) ) ;
// The rest of code before returning my customUser
}
func
принимаетTSource
, то он принимаетTSource
. Притворяться, что это требуетTTarget
, вероятно, плохо кончится. - person Oliver Charlesworth   schedule 29.09.2014CustomUser
расширяется изUser
, то преобразование не требуется. - person Oliver Charlesworth   schedule 29.09.2014TSource
иTTarget
реализуют что-то похожее, вы не сможете делать то, что хотите, потому что вы не можете гарантировать, чтоFunc<TTarget,bool>
совместимо сFunc<TSource,bool>
. Возможно, если вы объясните, почему, по вашему считаете, вам нужно это сделать, кто-нибудь сможет помочь с этим. - person Peter Ritchie   schedule 29.09.2014CustomerUser
не являетсяUser
, и вы все еще хотите обращаться с ним как сUser
(и вы уверены, что это сработает), лучше попробуйте обойти проблему, набравdynamic
. Нет смысла пытаться обойти статическую систему типов с помощью хитрых уловок, потому что (а) это не так просто, как кажется, и (б) вы можете легко отказаться от этого в более новых версиях языка. - person Theodoros Chatzigiannakis   schedule 29.09.2014Func<User,bool> userFunc = u=>func(UserToCustomUser(u))
и после использованияthis.GetUser(userfunc )
, но у вас должна быть функцияUserToCustomUser
, которая может сопоставлять объект пользователя с объектом пользователя-клиента. - person Grundy   schedule 29.09.2014Func<User,bool> userFunc = u=>func(UserToCustomUser(u))
- person Grundy   schedule 29.09.2014