使用泛型类型参数创建匿名函数?

时间:2015-10-13 13:33:31

标签: .net generics anonymous-methods

我们说我有这种方法:

int MyMethod(int arg)
{
    return arg;
}

我可以像这样创建一个匿名的等价物:

Func<int, int> MyAnonMethod = (arg) =>
{
    return arg;
};

但是,让我们说我有一个使用泛型类型参数的方法:

T MyMethod<T>(T arg)
{
    return arg;
}

如何将 创建为匿名方法?

3 个答案:

答案 0 :(得分:2)

您有两种选择:

  1. 您可以创建一个具体的委托对象,该对象指定T
  2. 的类型
  3. 使用现有T在通用上下文中声明委托。
  4. 第一个

    的例子
    var f = new Func<int, int>(MyMethod<int>);
    var result = f(10);
    

    第二个

    的示例
    T Test<T>()
    {
        T arg = default(T);
        Func<T, T> func = MyMethod; // Generic delegate
        return func(arg);
    }
    
    // Define other methods and classes here
    T MyMethod<T>(T arg)
    {
        return arg;
    }
    

    您将无法说服编译器或智能感知器在非通用上下文中使用委托来携带通用T,然后在调用它时计算出实际的T

    所以这不合法:

    void Test()
    {
        var fn = new Func<T, T>(MyMethod<T>);
        fn(10); // returns 10
        fn("Test"); // returns "Test"
    }
    

答案 1 :(得分:0)

仿制药的所有具体方法都是匿名的。你不能反过来。

这样做很简单:

T MyMethod<T>(T arg)
{
    return arg;
}

//...

Func<int, int> MyAnonMethod = MyMethod<int>;
MyAnonMethod(1); // returns 1

如果直接使用MyMethod,它将隐式使用正确的类型,例如:

MyMethod(1); // returns 1 of type int

答案 2 :(得分:0)

你可以使用

Func<T, T> MyAnonMethod = (arg) =>
{
    return arg;
};

如果您在T的某个地点(方法,班级)。如果您没有T,则可以创建一个返回Func的方法,如:

Func<T, T> CreateMyAnonMethod()
{
    returns (arg) => { return arg; };
}