【发布时间】:2013-11-12 14:19:06
【问题描述】:
嗯,我有以下场景:
public class Joins<TOuter, TInner, TResult>
{
public Expression<Func<TOuter, object>> outerKeySelector;
public Expression<Func<TInner, object>> innerKeySelector;
public Expression<Func<TOuter, TInner, object>> resultSelector;
public IEnumerable<TResult> r;
}
public class Test<T>
{
public IEnumerable<TResult> Join<TInner, TResult>(
Expression<Func<T, object>> outerKeySelector,
Expression<Func<TInner, object>> innerKeySelector,
Expression<Func<T, TInner, TResult>> resultSelector) where TInner : class
{
var join = new Joins<T, TInner, TResult>();
join.innerKeySelector = innerKeySelector;
join.outerKeySelector = outerKeySelector;
return join.r;
}
}
要创建 join 方法,我依靠链接:http://msdn.microsoft.com/en-us/library/bb534644(v=vs.100).aspx
但是,当我尝试调用该方法时,TInner 无法识别,使该方法变得无效我返回以下错误:
无法将表达式类型“type”转换为返回类型“TResult”
注意:'Joins' 类纯粹是一个测试,没有一个是确定的,var 'r' 仅供测试,仅用于方便退货。
预期用途示例:
var test = new Test<User>().Join<Permission>(u => u.Id, p => p.IdUser, (u, p) => new { Id = u.Id , Area = p.Area });
更多细节:
如前所述,TInner 无法识别,因此我无法正确调用方法。
作为测试,我这样做了:
var test = new Test<User>().Join<Permission>(u => u.Id, p => p.ToString(), (u, p) => new {Id = u.Id, Name = p.ToString()});
我知道 p.ToString() 不正确,但无法识别所指示的类的属性(在 Permission 的情况下),然后放入 ToString()只是为了完成编写方法。
编辑:
我需要在 foreach/for 中使用结果
示例:
foreach(var obj in test)
{
var id = obj.Id;
var area = obj.Area;
.
.
.
}
【问题讨论】:
-
你能举个例子说明你是如何称呼它的吗?
-
我更新了问题
-
Test<T>.Join不需要两个类型参数吗?您还试图返回一个匿名类,如果没有编译器推断TInner和TResult或使用dynamicAFAIK,它将无法工作。 -
你能给我们举个例子说明它应该是怎样的方法吗?
-
我不确定该方法是否存在问题。你可以在不指定 Join 类型参数的情况下调用它吗:
var test = new Test<User>().Join(u => ...)?
标签: c#-4.0 generics methods lambda generic-method