IEntityModelBuilderのすべての実装を次のコードで取得しようとしていますが、空のコレクションを返します。ジェネリックインターフェイスのすべての実装タイプを取得
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...
}
}
私は
var type = typeof(IEntityModelBuilder<User>);
と種類を変更する場合は、コードをフェッチタイプが正常に動作し、期待されるUserModelBuilderを返します。どのように私はジェネリックスでこれを行うことができますか?
魅力的ですが、Activator.GetInstanceで返されるタイプごとにインスタンスを取得できますか? –
はい、更新された回答を試してください。 –
近づく:どのように暗黙の変換についてのコンパイラの鞭打ちを止めることができますか?_entitymodelBuilders =(IEntityModelBuilder);) –