是否可以创建通用的Func <t> <t> </t> </t>

时间:2014-11-20 01:23:04

标签: c# generics lambda

是否可以创建通用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());

2 个答案:

答案 0 :(得分:5)

不,但是你可以将它放在静态类中,几乎可以提供你想要的东西:

static class CreateNull<T>
{
   public static Func<T> Default = () => default(T);
}

var createNull = CreateNull<User>.Default;

答案 1 :(得分:0)

没有。泛型只能应用于方法,委托和类。

泛型是一种编译器功能,允许您编写一个方法,编译器将为所需的每组类型生成一个方法。所以,如果你写:

public T DoSomething<T>(T input)

然后使用它:

int result1 = DoSomething(1);
double result2 = DoSomething(2.0);
MyType result3 = DoSomething(new MyType());

对于上面的每一行,JIT都会生成该方法的新重载。

Lambdas是键入的,因此它们会生成相关委托的特定重载:

// Given generic Func<TInput, TResult>
Func<int, string> foo = (s) => Integer.parseInt(s);