如何将Func <t1,bool =“”>转换为Func <t2,bool> in C#</t2,bool> </t1,>

时间:2014-09-28 20:02:52

标签: c# .net generics func system.reflection

我尝试使用refelecion编写一个函数来转换函数Func&lt; TSource,bool&gt;到Func&lt; TTarget,bool&gt;但没有成功

这就是我所做的:

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'而第二个没有它。

在我的服务代理中,我有一个函数Ge​​tUser(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
}

2 个答案:

答案 0 :(得分:1)

您尝试将Func<TSource, bool>转换为Func<TTarget, bool>,而没有任何其他细节或限制。

考虑TSourcestringTTargetXmlDocument的情况。适合第一个代理的方法是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)