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ę)?

questionAnswers(1)

yourAnswerToTheQuestion