是否可以创建一个通用的 Func
本文关键字:Func 一个 创建 是否 | 更新日期: 2023-09-27 18:31:01
是否可以创建一个泛型Func<T><T>
,就像在接受泛型参数并需要返回该泛型参数的类型的 Func 中一样?
换句话说,我可以这样做吗?
Func<T> createNull = () => default(T);
请注意,我没有来自包含类或方法的任何上下文,所以我想这样做:
var user = createNull<User>();
以下是有关我正在尝试执行的操作的更多信息(请注意,语法已关闭,因为我不知道该怎么做,也不知道是否可能):
Func<TQuery, TResult><TQuery, TResult> query = q =>
(TResult) handlers[Tuple.Create(typeof(TQuery), typeof(TResult))](q);
其中处理程序声明如下:
var handlers = new Dictionary<Tuple<Type, Type>, Func<TQuery, TResult><TQuery, TResult>();
// examples
handlers.Add(Tuple.Create(typeof(ById), typeof(User)),
idQuery => new User());
handlers.Add(Tuple.Create(typeof(ByName), typeof(Customer)),
otherQuery => new Customer());
然后我想使用这样的query
:
User result = query<User, IdQuery>(new ById{Id = 1});
Customer result1 = query<Customer, ByName>(new ByName());
不,但你可以把它放在静态类中,它几乎可以给你你想要的:
static class CreateNull<T>
{
public static Func<T> Default = () => default(T);
}
var createNull = CreateNull<User>.Default;
No.泛型只能应用于方法、委托和类。
泛型是一种编译器功能,允许您编写一个方法,编译器将为所需的每组类型生成一个方法。所以如果你写:
public T DoSomething<T>(T input)
然后使用它:
int result1 = DoSomething(1);
double result2 = DoSomething(2.0);
MyType result3 = DoSomething(new MyType());
对于上面的每行,JIT 都会生成方法的新重载。
Lambda 是类型化的,因此它们会生成相关委托的特定重载:
// Given generic Func<TInput, TResult>
Func<int, string> foo = (s) => Integer.parseInt(s);