Hoje eu tenho a seguinte situação:
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;
}
}
Para criar o método eu me baseei no link: MSDN
No entanto, quando eu tento chamar o método, TInner não é reconhecido, fazendo com que o método se torne inválido me retornando o seguinte erro:
Cannot convert expression type 'type' to return type 'TResult'
Nota: A classe 'Join' é puramente um teste, nada disso é definitivo e a var 'r' é somente para teste, usado apenas para facilitar o retorno.
Exemplo de uso pretendido:
var test = new Test<User>().Join<Permission>(u => u.Id, p => p.IdUser, (u, p) => new { Id = u.Id , Area = p.Area });
Mais detalhes:
Como mencionado, TInner não é reconhecido, por isso não posso fazer uma chamada o método correto.
Como um teste que eu fiz assim:
var test = new Test<User>().Join<Permission>(u => u.Id, p => p.ToString(), (u, p) => new {Id = u.Id, Name = p.ToString()});
Eu sei
p.ToString() não é correto, mas como não está reconhecendo as propriedades da classe indicada (no caso
Permission), eu coloquei
ToString() apenas para terminar de escrever o método.
Eu preciso usar o resultado em um foreach / for da seguinte maneira:
foreach(var obj in test)
{
var id = obj.Id;
var area = obj.Area;
.
.
.
}
Alguém sabe como resolver isso?