C# 通用铸造混淆

C# 通用铸造混淆,c#,generics,C#,Generics,我对铸造泛型类型有点迷茫,不知道是否有人能指出我遗漏了什么 我有一个抽象类定义: public abstract class BaseEntityTypeConfiguration<TEntity> : IEntityTypeConfiguration<TEntity> where TEntity : class { public void Configure(EntityTypeBuilder<TEntity> builder) {

我对铸造泛型类型有点迷茫,不知道是否有人能指出我遗漏了什么

我有一个抽象类定义:

public abstract class BaseEntityTypeConfiguration<TEntity> : IEntityTypeConfiguration<TEntity>
    where TEntity : class
{
    public void Configure(EntityTypeBuilder<TEntity> builder)
    {
        ConfigureEntity(builder);

        var audited = builder as EntityTypeBuilder<IAuditedEntity>;
        audited?.ConfigureAudited();
        
        var timestamped = builder as EntityTypeBuilder<ITimestampEnabled>;
        timestamped?.ConfigureTimestamp();

        var softDelete = builder as EntityTypeBuilder<ISoftDelete>;
        softDelete?.ConfigureSoftDelete();

    }

    public abstract void ConfigureEntity(EntityTypeBuilder<TEntity> builder);

}
公共抽象类BaseEntityTypeConfiguration:EntityTypeConfiguration
地点:班级
{
公共void配置(EntityTypeBuilder)
{
配置实体(生成器);
var audited=作为EntityTypeBuilder的生成器;
已审核?.ConfigureAudited();
var timestamp=builder作为EntityTypeBuilder;
时间戳?.ConfigureTimestamp();
var softDelete=builder作为EntityTypeBuilder;
softDelete?.ConfigureSoftDelete();
}
公共抽象无效配置实体(EntityTypeBuilder);
}
在我的项目中,当TEntity是一个实现IAuditedEntity和ITimestampEnabled的Customer类时,就会调用它


如何将
EntityTypeBuilder
参数强制转换为
EntityTypeBuilder
,等等?

我看到的选项之一是仅使
ConfigureAudited
接受
EntityTypeBuilder
,而不是
EntityTypeBuilder
。但这将使实体设置复杂化,并可能使您的代码不具有类型安全性(尽管可能可以使用属性解决)

另一个选择是反射。您可以将configure方法移动到静态类(为了方便起见),并像这样使用它们:

public static class AuditedEntityExt
{
    public static void ConfigureAudited<T>(EntityTypeBuilder<T> tb) where T : class, IAuditedEntity
    {
        // entity setup
    }
}

public void Configure<T>(EntityTypeBuilder<T> tb) where T: class
{    
    if(typeof(IAuditedEntity).IsAssignableFrom(typeof(T)))
    {
        typeof(AuditedEntityExt).GetMethod(nameof(AuditedEntityExt.ConfigureAudited))
            .MakeGenericMethod(typeof(T))
            .Invoke(null, new[] { tb });
    }
}
公共静态类AuditedEntityText
{
公共静态void ConfigureAudited(EntityTypeBuilder tb),其中T:class,IAuditedEntity
{
//实体设置
}
}
公共void配置(EntityTypeBuilder tb),其中T:class
{    
if(typeof(IAuditedEntity).IsAssignableFrom(typeof(T)))
{
typeof(AuditedEntityText.GetMethod(nameof(AuditedEntityText.ConfigureAudited))
.MakeGenericMethod(类型(T))
.Invoke(null,新[]{tb});
}
}

类是不变的,因此不能将
EntityTypeBuilder
强制转换为
EntityTypeBuilder
。您可以创建一个
EntityTypeBuilder
界面,该界面允许您根据需要支持的操作将
EntityTypeBuilder
转换为
EntityTypeBuilder
。您好,感谢您的回复。鉴于Configure方法是从实体框架核心代码调用的,我可以声明一个
IEntityTypeBuilder
来实现这一点吗?还是我被卡住了?图例,谢谢!我对每个接口都有扩展方法,您所建议的方法非常有效。我倾向于避免像瘟疫一样的反思,但我认为这是一种有意义的情况。一旦我完成了这个可交付成果,我将重新访问库,并尝试提出一个不同的设计。再次感谢,我真的很感谢你抽出时间。