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属性=\What
foreach
您的意思是什么(如果您在某处使用它,您应该提供一个示例)。另外,“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>(...