如何转换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<;T1,布尔>;到Func<;T2,布尔>;在C#中

您正在尝试将Func<TSource, bool>转换为Func<TTarget, bool>,而不需要任何其他细节或约束。

考虑TSourcestring并且TTargetXmlDocument的情况。适合第一个委托的方法是string.StartsWith(string),适合第二个委托的方式是List<XmlDocument>.Contains(XmlDocument)

因此,当您执行以下操作时(如果我们假设您的代码有效,则为有效调用):

var converted = Convert<string, XmlDocument>("String".StartsWith);

然后你打电话给:

var result = converted.Invoke(new XmlDocument());

你认为会发生什么?你的目标是什么?

最后,@Grundy的解决方案对我来说是正确的,我只需要创建一个函数,将对象User转换为CustomUser

Func<User,bool> userFunc = u=>func(UserToCustomUser(u))
this.GetUser(userfunc)