Umgehen des Mangels an partieller generischer Typinferenz mit Einschränkungen

Ich habe eine Schnittstelle (die von Repositorys verwendet wird), die dieses Mitglied hat:

T FindById<T, TId>(TId id)
    where T : class, IEntity<TId>
    where TId : IEquatable<TId>;

Auf diese Weise kann der Anrufer einen Entitätstyp angeben (T) und die Art davonId Feld (TId). Der Implementierer dieser Schnittstelle würde dann die Entitäten vom Typ findenT und benutze dieid Parameter, um sie nach ihrer ID zu filtern (die am definiert ist)IEntity<TId>).

Momentan rufe ich es so an:

int id = 123;
var myApproval = PartsDC.FindById<Approval, int>(id);

Idealerweise würde ich das gerne machen:

int id = 123;
var myApproval = PartsDC.FindById<Approval>(id);

Ich habe die Antworten auf diese Frage gelesen:

Teilweise generische Typinferenz in C # möglich?

Ich verstehe, dass ich nicht die Syntax bekomme, die ich will, aber nahe kommen kann. Ich kann es in meinem Fall jedoch aufgrund meiner generischen Parameterbeschränkungen nicht richtig einrichten.

Folgendes habe ich bisher:

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);
    }
}

Der Kompilierungsfehler, den ich erhalte, ist:

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>'.

Ich verstehe, was es sagt, weil dieT In meiner Wrapper-Klasse darf es sich nur um einen Referenztyp handelnFindById Funktion will es seinIEntity<TId>, aber ich kann das nicht alsTId ist in der Methode (ansonsten bin ich wieder auf Platz eins).

Wie kann ich dieses Problem umgehen (oder kann ich nicht)?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage