是否有可能将Func <t1,t2,tresult>转换为Func <t2,t1,tresult> </t2,t1,tresult> </t1,t2,tresult>

时间:2013-02-21 08:02:01

标签: c# delegates lambda

首先,foo是Func&lt; T1,T2,TResult&gt;宾语。 有可能做类似

的事情
Func<T2,T1,TResult> bar = ConvertFunction(foo);

因此转换Func&lt; T1,T2,TResult&gt;到Func&lt; T2,T1,TResult&gt;。

2 个答案:

答案 0 :(得分:7)

是的,这是可能的:

Func<T2, T1, TResult> bar = (t2, t1) => foo(t1, t2);

这基本上创建了另一个具有切换参数的委托,内部简单地调用原始委托 如果您只有Func<T1, T2, TResult>而不是Expression<Func<T1, T2, TResult>>,则这是唯一的方式来执行此类“转化”。

答案 1 :(得分:0)

这是功能:

class MyFuncConverter<T1, T2, TResult>
{
    static Func<T1, T2, TResult> _foo;

    public static Func<T2, T1, TResult> ConvertFunction(Func<T1, T2, TResult> foo)
    {
        _foo = foo;
        return new Func<T2, T1, TResult>(MyFunc);
    }

    private static TResult MyFunc(T2 arg2, T1 arg1)
    {
        return _foo(arg1, arg2);
    }
}

样本用法:

static void Main(string[] args)
{
    var arg1 = 10;
    var arg2 = "abc";

    // create a Func with parameters in reversed order 
    Func<string, int, string> testStringInt = 
        MyFuncConverter<int, string, string>.ConvertFunction(TestIntString);

    var result1 = TestIntString(arg1, arg2);
    var result2 = testStringInt(arg2, arg1);

    // testing results
    Console.WriteLine(result1 == result2);
}

/// <summary>
/// Sample method
/// </summary>
private static string TestIntString(int arg1, string arg2)
{
    byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII
        .GetBytes(arg2.ToString() + arg1);
    string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
    return returnValue;
}