C# 4.0 具有泛型返回的泛型方法
好吧,我有以下场景:C# 4.0 具有泛型返回的泛型方法,c#-4.0,generics,methods,lambda,generic-method,C# 4.0,Generics,Methods,Lambda,Generic Method,好吧,我有以下场景: public class Joins<TOuter, TInner, TResult> { public Expression<Func<TOuter, object>> outerKeySelector; public Expression<Func<TInner, object>> innerKeySelector; public Expression<Func<TOuter
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;
}
}
要使其正常工作,您应执行以下操作:
var test = new Test<User>().Join<Permission, object>(u => u.Id, p => p.IdUser, (u, p) => new { Id = u.Id, Area = p.Area });
// ^^ (resolve the second type argument as well)
public TResult Join<TInner, TResult>
var test = new Test<User>().Join<Permission, dynamic>(...
之后,您可以按如下方式使用它:
var test = new Test<User, Permission>()
.Join(u => u.Id, p => p.IdUser, (u, p) => new { Id = u.Id, Area = p.Area });
这将允许您将结果用于
LinQ
.Where(
方法,但不支持intellisense(除非为联接输出创建具体类).你能举一个例子说明你是如何调用它的吗?我更新了问题不测试。Join
需要两个类型参数吗?你还试图返回一个匿名类,如果没有编译器推断TInner
和TResult
或使用动态AFAIK,它将无法工作。你能吗你给我们举一个例子,说明它应该如何成为方法?我不确定该方法是否有问题。你能在不指定Join的类型参数的情况下调用它吗:var test=new test()。Join(u=>…)
?好的。方法“有效”,但是,我的TResult仍然无法识别,例如,在foreach中,我无法读取新对象的de属性=\Whatforeach
您的意思是什么(如果您在某处使用它,您应该提供一个示例)。另外,“recognize TResult”是什么意思?我更新了问题。事实上,返回是一个IEnumerable对象。TResult将是一个未知对象(当我假设它是object类型时,它不识别对象的实际类型),在调用该方法时被通知(由用户类和权限类的联合表示,并选择两个字段Id和Area,从而生成包含属性Id和Area的新对象)。但是,当我尝试执行foreach时,属性无法识别。如果执行某些更新,则应编写“编辑:/UPDATED:”然后添加您的新数据,因为这对于阅读您的previos想法的人来说是不清楚的。当然,我错了。问题是我不能将测试类更改为具有另一个泛型对象,它必须在方法中工作。
public TResult Join<TInner, TResult>
public class Test<T, TInner> where TInner : class where T : class
{
public IEnumerable<TResult> Join<TResult>(
...
Expression<Func<T, TInner, TResult>> resultSelector)
var test = new Test<User, Permission>()
.Join(u => u.Id, p => p.IdUser, (u, p) => new { Id = u.Id, Area = p.Area });
var test = new Test<User>().Join<Permission, dynamic>(...