【发布时间】:2023-04-03 23:30:02
【问题描述】:
我正在尝试简化一些 EF Code First 配置。
不要像这样写代码:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Asset>().ToTable("Assets");
modelBuilder.Entity<VideoAsset>().ToTable("VideoAssets");
modelBuilder.Entity<ImageAsset>().ToTable("ImageAssets");
...
}
我将每个类型声明的表包装到一个类中,并使用反射来调用模型构建器
public class TablePerTypeBuilder<TBase> where TBase : class
{
public void Build(DbModelBuilder modelBuilder)
{
//modelBuilder.Entity<Asset>().ToTable("Assets");
modelBuilder.Entity<TBase>().ToTable(typeof(TBase).Name);
//modelBuilder.Entity<VideoAsset>().ToTable("VideoAssets");
//modelBuilder.Entity<ImageAsset>().ToTable("ImageAssets");
var types = from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
where typeof(TBase).IsAssignableFrom(t)
select t;
foreach (Type type in types)
{
modelBuilder.Entity<type>().ToTable(type.Name);
//Error - The type or namespace name 'type' could not be found (are you missing a using directive or an assembly reference?)
}
}
}
由于编译时安全性,无法将类型添加为泛型参数。那么是否可以使用反射进行相同的调用?
目的是像调用builder一样
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
TablePerTypeBuilder<Asset> builder = new TablePerTypeBuilder<Asset>();
builder.Build(modelBuilder);
}
【问题讨论】:
-
看看
MakeGenericMethod():msdn.microsoft.com/en-us/library/… -
MakeGenericMethod 可以和参考参数一起使用吗?在这种情况下,我认为我们不想创建调用类的新实例。
-
你是如何简化它的?看起来您必须使用您的解决方案编写更多代码。除了在编译时进行类型检查,这样做有什么好处?
-
当我想在系统中引入更多资产时...
标签: c# entity-framework generics reflection