Ich versuche, eine generische GetById(T id)
Methode zu implementieren, die Typen abdeckt, die unterschiedliche ID-Typen haben können. In meinem Beispiel habe ich eine Entität, die eine ID vom Typ int
und eine vom Typ string
hat.Wie generische GetById() zu implementieren, wo ID von verschiedenen Typen sein kann
Allerdings halte ich erhalte eine Fehlermeldung, und ich habe keine Ahnung, warum:
Der Typ ‚int‘ muss einen Referenztyp sein, um es als Parameter ‚TId‘ zu verwenden in der generischen Art der Methode IEntity
Entity-Schnittstelle:
für meine Domain-Modelle Um gerecht, die IDs vom Typ int
oder string
haben.
public interface IEntity<TId> where TId : class
{
TId Id { get; set; }
}
Entity Implementationen:
public class EntityOne : IEntity<int>
{
public int Id { get; set; }
// Other model properties...
}
public class EntityTwo : IEntity<string>
{
public string Id { get; set; }
// Other model properties...
}
Generisches Repository-Schnittstelle:
public interface IRepository<TEntity, TId> where TEntity : class, IEntity<TId>
{
TEntity GetById(TId id);
}
Generisches Repository Implementierung:
public abstract class Repository<TEntity, TId> : IRepository<TEntity, TId>
where TEntity : class, IEntity<TId>
where TId : class
{
// Context setup...
public virtual TEntity GetById(TId id)
{
return context.Set<TEntity>().SingleOrDefault(x => x.Id == id);
}
}
Repository Implementationen:
public class EntityOneRepository : Repository<EntityOne, int>
{
// Initialise...
}
public class EntityTwoRepository : Repository<EntityTwo, string>
{
// Initialise...
}
Warum Sie beschränken 'TId' auf' CLASS' Typen? Das wird nicht mit 'int' funktionieren (die Fehlermeldung macht das ziemlich klar). 'class' bedeutet" Referenztyp "in generischen Constraints. –