我们说我有这种方法:
int MyMethod(int arg)
{
return arg;
}
我可以像这样创建一个匿名的等价物:
Func<int, int> MyAnonMethod = (arg) =>
{
return arg;
};
但是,让我们说我有一个使用泛型类型参数的方法:
T MyMethod<T>(T arg)
{
return arg;
}
如何将 创建为匿名方法?
答案 0 :(得分:2)
您有两种选择:
T
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"
}
答案 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; };
}