【发布时间】:2014-11-20 01:23:04
【问题描述】:
是否可以创建一个泛型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);
其中 handlers 声明如下:
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());
【问题讨论】:
-
只是一些建议。与其一遍又一遍地写出
Dictionary<Tuple<Type, Type>, Func<TQuery, TResult>>之类的东西,不如在文件顶部使用using HandlerCache = Dictionary<Tuple<Type, Type>, Func<TQuery, TResult>为它起别名,并且在整个文件中,您可以将其简单地称为HandlerCache(尽管在其他所有方面它都是丑陋的复合体类型)。不像 F# 那样流畅,但仍然很有帮助 -
标题和开头句中的语法
Func<T><T>没有意义。您的意思是Func<T1, T2>或Func<TQuery, TResult>(正如您稍后在问题中展示的那样)?