Praca nad brakiem częściowego wnioskowania rodzajowego z ograniczeniami
Mam interfejs (używany przez repozytoria), który ma tego członka:
T FindById<T, TId>(TId id)
where T : class, IEntity<TId>
where TId : IEquatable<TId>;
Dzięki temu wywołujący może określić typ encji (T
) i rodzaj tegoId
pole (TId
). Implementor tego interfejsu znajdowałby wtedy jednostki typuT
i użyjid
parametr do filtrowania ich zgodnie z ich identyfikatorem (który jest zdefiniowany naIEntity<TId>
).
Obecnie nazywam to tak:
int id = 123;
var myApproval = PartsDC.FindById<Approval, int>(id);
Idealnie chciałbym to zrobić:
int id = 123;
var myApproval = PartsDC.FindById<Approval>(id);
Przeczytałem odpowiedzi na to pytanie:
Częściowe wnioskowanie ogólne możliwe w C #?
Rozumiem, że nie mogę uzyskać takiej składni, ale mogę się zbliżyć. Nie mogę jednak ustawić go poprawnie w moim przypadku ze względu na moje ogólne ograniczenia parametrów.
Oto, co mam do tej pory:
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);
}
}
Błąd kompilacji jaki otrzymuję to:
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>'.
Rozumiem, co to mówi, ponieważT
w mojej klasie opakowującej jest ograniczony tylko do typu odniesienia, aleFindById
funkcja chce, żeby tak byłoIEntity<TId>
, ale nie mogę tego zrobić jakoTId
jest w metodzie (w przeciwnym razie wrócę do pierwszego).
Jak mogę obejść ten problem (lub nie mogę)?