如何在泛型方法中使用匿名返回类型?(如linq中的select方法)

时间:2015-10-28 10:30:08

标签: c# linq generics

我有一个通用的方法,如:

IEnumerable<TResult> Select2<TSource, TResult>(Func<TSource, TResult> selector)

方法调用:

var r = Select2(p => new { FullName = p.FirstName + " " + p.LastName });

如何在方法调用中设置TResult? 在linq中当你使用select方法你可以看到Tresult类型为'a enter image description here 更新

例如,我有自己的orm,在select方法中,我生成一个T-Sql select查询。我的方法我想要定义特定列并从我的规范中获取结果。如果我调用类似

的方法
var r=Select2<Person,?>(p=> new{Name=p.FirstName ,Family=p.LastName})

我希望我生成一个带有FirstName和LastName列的select,返回类型只有Name和Family属性

2 个答案:

答案 0 :(得分:3)

我假设方法的签名是

TResult Select2<TSource, TResult>(Func<TSource, TResult> selector)

简单地写var r = Select2(p => new { ... })并不起作用,因为编译器只能推断TResult的类型而不是TSource的类型。

使通用类型显式不起作用,因为正如您所见,您无法为匿名类型执行此操作。

你可以做的是通过以不同的方式编写lambda来帮助编译器:

var r = Select2((Person p) => new { ... });

这样编译器就知道TSource的类型并且可以推断出TResult的类型。

答案 1 :(得分:0)

我不能说我更喜欢这样做,但在这种情况下你应该使用动态:

IEnumrable<dynamic> Select2<TSource>(Func<TSource, dynamic> selector);
//method call
var r=Select2<Person>(p=> new{FullName=p.FirstName +" "+p.LastName});

如果你看一下像Dapper这样的微型ORM,你会发现它们也支持返回动态类型的方法调用。