Ho un'interfaccia (che è utilizzato dal repository) che ha questo membro:lavoro intorno mancanza di parziale tipo generico inferenza con vincoli
T FindById<T, TId>(TId id)
where T : class, IEntity<TId>
where TId : IEquatable<TId>;
Questo permette al chiamante di specificare un tipo di entità (T
) e la tipo di esso è il campo Id
(TId
). L'implementatore di questa interfaccia troverà quindi le entità di tipo T
e utilizzerà il parametro id
per filtrarli in base al loro ID (definito su IEntity<TId>
).
Attualmente sto chiamando in questo modo:
int id = 123;
var myApproval = PartsDC.FindById<Approval, int>(id);
Idealmente mi piacerebbe fare questo:
int id = 123;
var myApproval = PartsDC.FindById<Approval>(id);
Ho letto le risposte a questa domanda:
Partial generic type inference possible in C#?
Capisco che non riesco a ottenere la sintassi che voglio, ma posso avvicinarmi. Non riesco a farlo funzionare correttamente nel mio caso, ma a causa dei miei limiti di parametri generici.
Ecco quello che ho finora:
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);
}
}
l'errore di compilazione che ottenga è:
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>'.
ho capito quello che sta dicendo, perché il T
nella mia classe wrapper è vincolato solo per essere un tipo di riferimento, ma la funzione FindById
vuole che sia IEntity<TId>
, ma non posso farlo perché il metodo TId
è nel metodo (altrimenti sono tornato in quadrato uno).
Come posso aggirare questo problema (o non posso)?
Non si può aggiungere 'TID' come vincolo a' FindIdWrapper'? – Nick
@Nick no, perché il 'TID' non è noto al punto dell'applicazione parziale –