C# - 当传入带参数的函数时,泛型类型函数试图将结果赋给System.Func(指定类型)

时间:2011-06-16 20:59:46

标签: c# asp.net generics

我正在使用一个类似于以下方法的类:

public static T Get<T>(string key, Func<T> method)
    {
        //do stuff
        var obj = method.Invoke();
        return (T)obj
    }

如果我这样称呼它会很好:

var x = Get<string>("mykey", test);

其中test是一个没有参数并返回字符串的函数。但是,只要测试有参数,事情就会中断。如果我尝试:

var x = Get<string>("mykey", test(myparam));

我收到错误“Argument type”String“不能分配给参数类型”System.Func&lt; string&gt;“。

我知道(myparam)的添加是问题所在,但我不确定应该如何修复它。问题是如何编写库的函数或者我是如何传递参数的?

5 个答案:

答案 0 :(得分:2)

var x = Get<string>("mykey", () => test(myparam));

答案 1 :(得分:1)

您需要curry参数,方法是传递一个不带参数的lambda表达式,并使用其他地方的参数调用函数:

var x = Get<string>("mykey", () => test(myparam));

答案 2 :(得分:1)

您可以像下面的示例代码一样调用它:

Get("mykey", () => test(myparam))

    public static T Get<T>(string key, Func<T> method)
    {
        //do stuff
        var obj = method.Invoke();
        return (T)obj;
    }
    void Xyz()
    {
        int myparam = 0;
        var x = Get("mykey", () => test(myparam)); // <string> is not needed
    }
    double test(int i)
    {
        return 0.0;
    }

答案 3 :(得分:0)

这是你传递参数的方式。 test(myparam)的类型为String,您需要传递一个函数,它会返回String。您可以使用lambda表达式轻松地创建一个:

var x = Get<string>("mykey", () => test(myparam));

lambda表达式() => foo创建一个函数,在调用时,执行并返回foo

答案 4 :(得分:-1)

您需要更改Func定义以定义输入参数:

Func<T,T1,T2,T3> method