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

Create anonymous function using generic type parameters?

假设我有这个方法:

int MyMethod(int arg)
{
    return arg;
}

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

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

但是假设我有一个使用泛型类型参数的方法,如下所示:

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

如何创建 that 作为匿名方法?

泛型的所有具体方法都是匿名的。你不能反过来。

这样做很简单:

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

你可以使用

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

如果你在某个地点(方法,class)你有 T。如果你没有 T 你可以创建一个 returns 一个 Func 的方法,比如:

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

你有两个选择:

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

第一个例子

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"
}