我试图使用以下代码获取所有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。我如何使用泛型来做到这一点?
IEntityModelBuilderHelper
)并得到错误的结果。如果没有其他方法,我会这样做,但有更安全的解决方案可用。 - InBetweenIEntityModelBuilder
的协变(out 关键字)的情况下完成。 - Slava Utesinovtypeof(Foo<>)
而不是封闭类型typeof(Foo<string>)
来明确获取你想要的类型而避免冲突。在反射中,使用开放式泛型没有任何问题。 - Adam Houldsworth