我有一个通用的方法,如:
IEnumerable<TResult> Select2<TSource, TResult>(Func<TSource, TResult> selector)
方法调用:
var r = Select2(p => new { FullName = p.FirstName + " " + p.LastName });
如何在方法调用中设置TResult?
在linq中当你使用select方法你可以看到Tresult类型为'a
的 更新
例如,我有自己的orm,在select方法中,我生成一个T-Sql select查询。我的方法我想要定义特定列并从我的规范中获取结果。如果我调用类似
var r=Select2<Person,?>(p=> new{Name=p.FirstName ,Family=p.LastName})
我希望我生成一个带有FirstName和LastName列的select,返回类型只有Name和Family属性
答案 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,你会发现它们也支持返回动态类型的方法调用。