Trabalhando em torno da falta de inferência de tipo genérico parcial com restrições
Eu tenho uma interface (que é usada por repositórios) que tem esse membro:
T FindById<T, TId>(TId id)
where T : class, IEntity<TId>
where TId : IEquatable<TId>;
Isso permite que o chamador especifique um tipo de entidade (T
) e o tipo deId
campo (TId
). O implementador dessa interface, então, encontraria as entidades do tipoT
e use oid
parâmetro para filtrá-los de acordo com seu id (que é definido emIEntity<TId>
).
Atualmente estou chamando assim:
int id = 123;
var myApproval = PartsDC.FindById<Approval, int>(id);
Idealmente eu gostaria de fazer isso:
int id = 123;
var myApproval = PartsDC.FindById<Approval>(id);
Eu li as respostas para esta pergunta:
Inferência de tipo genérico parcial possível em C #?
Eu entendo que não consigo obter a sintaxe que quero, mas posso chegar perto. Não consigo configurar corretamente no meu caso, por causa de minhas restrições genéricas de parâmetro.
Aqui está o que eu tenho até agora:
public class FindIdWrapper<T> where T : class
{
public readonly IDataContext InvokeOn;
public FindIdWrapper(IDataContext invokeOn)
{
InvokeOn = invokeOn;
}
T ById<TId>(TId id) where TId : IEquatable<TId>
{
return InvokeOn.FindById<T, TId>(id);
}
}
public static class DataContextExtensions
{
public static FindIdWrapper<T> Find<T>(this IDataContext dataContext) where T : class, IEntity
{
return new FindIdWrapper<T>(dataContext);
}
}
O erro de compilação que recebo é:
The type 'T' cannot be used as type parameter 'T' in the generic type or method 'PartsLegislation.Repository.IDataContext.FindById<T,TId>(TId)'. There is no implicit reference conversion from 'T' to 'PartsLegislation.Repository.IEntity<TId>'.
Eu entendo o que está dizendo porque oT
na minha classe wrapper é apenas restrito a ser um tipo de referência, mas oFindById
função quer que sejaIEntity<TId>
, mas eu não posso fazer isso como oTId
está no método (caso contrário, estou de volta ao quadrado).
Como posso contornar este problema (ou não posso)?