Ich versuche, alle Implementierungen von IEntityModelBuilder mit dem folgenden Code zu erhalten, aber stattdessen gibt es eine leere Auflistung zurück.Erhalten Sie alle Implementierungstypen einer generischen Schnittstelle
public class EntityFrameworkDbContext : DbContext
{
//constructor(s) and entities DbSets...
private static IEnumerable<IEntityModelBuilder<IEntity>> _entitymodelBuilders;
internal IEnumerable<IEntityModelBuilder<IEntity>> EntityModelBuilders
{
get
{
if (_entitymodelBuilders == null)
{
var type = typeof(IEntityModelBuilder<IEntity>);
_entitymodelBuilders = Assembly.GetAssembly(type).GetTypes()
.Where(t => type.IsAssignableFrom(t) && t.IsClass)
.Select(t => (IEntityModelBuilder<IEntity>)Activator.CreateInstance(t, new object[0]));
}
return _entitymodelBuilders;
}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
foreach (var builder in EntityModelBuilders)
builder.Build(modelBuilder);
base.OnModelCreating(modelBuilder);
}
}
internal interface IEntityModelBuilder<TEntity> where TEntity : IEntity
{
void Build(DbModelBuilder modelBuilder);
}
//sample implementation
internal class UserModelBuilder : IEntityModelBuilder<User>
{
public void Build(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.ToTable("users")
.HasKey(e => e.Id);
modelBuilder.Entity<User>()
.Property(e => e.Id)
.HasColumnName("id");
modelBuilder.Entity<User>()
.Property(e => e.Email)
.HasColumnName("email");
//and so on...
}
}
Wenn ich den Typ mit
var type = typeof(IEntityModelBuilder<User>);
die Typen holen Code ändern läuft gut und gibt den erwarteten UserModelBuilder. Wie kann ich das mit Generika machen?
Funktioniert wie ein Zauber, aber ist es möglich, eine Instanz für jeden einzelnen Typ zu erhalten, der mit Activator.GetInstance zurückgegeben wird? –
Ja, versuchen Sie die aktualisierte Antwort. –
Näher kommen: Wie kann ich den Compiler aufhören zu jammern über die implizite Konvertierung (d. H. _entitymodelBuilders = (IEntityModelBuilder) Objekte)? –