如何转换Func<;T1,布尔>;到Func<;T2,布尔>;在C#中
本文关键字:lt gt 布尔 Func T2 T1 转换 何转换 | 更新日期: 2023-09-27 18:25:02
我试图使用refelection来编码一个函数,以转换函数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"。假设"User"answers"CutomUser"之间的不同之处在于,第一个有"Password"属性,第二个没有。
在我的服务代理中,我有一个函数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, 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());
你认为会发生什么?你的目标是什么?
最后,@Grundy的解决方案对我来说是正确的,我只需要创建一个函数,将对象User转换为CustomUserFunc<User,bool> userFunc = u=>func(UserToCustomUser(u))
this.GetUser(userfunc)