我尝试使用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;
}
在我的情况下,我有一个对象用户作为DTO,并且不想与其他图层共享此DTO,它只能由我的服务代理人看到, 然后,有另一个层可以访问我的服务代理,在这一层我有另一个代表用户的对象让我们说'CustomUser'。 让我们说'User'和'CutomUser'之间的区别在于第一个具有属性'Password'而第二个没有它。
在我的服务代理中,我有一个函数GetUser(Func&lt; User,bool&gt; func),但在我的第三方图层中我看不到对象User,但是,对象CustomUser是可见的 因此,在我的服务代理层中,我想创建另一个将被其他层可见的函数GetUser(Func&lt; CustomUser,bool&gt;) 并且此函数使用转换器直接调用第一个隐藏函数GetUser(Func&lt; User,bool&gt;)
public CustomUser GetUser(Func<CustomUser, bool> func) {
// var myUser = this.GetUser(ConvertFunc( func) ) ;
// The rest of code before returning my customUser
}
答案 0 :(得分:1)
您尝试将Func<TSource, bool>
转换为Func<TTarget, bool>
,而没有任何其他细节或限制。
考虑TSource
是string
且TTarget
是XmlDocument
的情况。适合第一个代理的方法是string.StartsWith(string)
,适合第二个代理的方法是List<XmlDocument>.Contains(XmlDocument)
。
因此,当您执行以下操作时(如果我们假设您的代码有效,则执行有效调用):
var converted = Convert<string, XmlDocument>("String".StartsWith);
然后你打电话:
var result = converted.Invoke(new XmlDocument());
您认为会发生什么?你打算做什么?
答案 1 :(得分:1)
最后,@ Grundy的解决方案对我有用, 我只是创建一个将对象用户转换为 CustomUser 的功能,然后执行以下操作:
Func<User,bool> userFunc = u=>func(UserToCustomUser(u))
this.GetUser(userfunc)