Я использую следующую обобщенную функцию c, чтобы определить, реализует ли класс указанный интерфейс:
private static bool HasFieldType<TEntity, TInterface>()
{
return typeof(TInterface).IsAssignableFrom(typeof(TEntity));
}
В большинстве случаев это работает нормально.
Однако теперь у меня есть интерфейс, который имеет универсальный параметр c:
public interface IStatusField<TEnum> where TEnum : System.Enum
{
TEnum Status { get; set; }
}
И это приводит к сбою функции HasFieldType
с ошибкой unexpected use of unbound generic name
.
В идеале я хочу вызвать функцию следующим образом:
if (HasFieldType<TEntity, IStatusField<>>())
{
// builder is an EntityTypeBuilder instance
builder.Property("Status")
.HasMaxLength(255)
.HasConversion(new EnumToStringConverter<>());
}
Но это не сработает, поскольку я не указываю тип generi c для IStatusField<>
или EnumToStringConverter<>
.
Есть ли способ обойти это?
ОБНОВЛЕНИЕ
Этот код является частью обобщенного c base IEntityTypeConfiguration
класса следующим образом:
public abstract class EntityTypeConfiguration<TPrimaryKey, TEntity> : IEntityTypeConfiguration<TEntity> where TEntity : Entity<TPrimaryKey>
{
public void Configure(EntityTypeBuilder<TEntity> builder)
{
builder.HasKey(e => e.Id);
builder.Property(e => e.Id)
.IsRequired()
.HasMaxLength(13)
.HasValueGenerator<PrimaryKeyValueGenerator>();
// Apply the generic interface properties
builder.ApplyInterfaceFields<TPrimaryKey, TEntity>();
// Apply any additional configuration
this.OnConfigure(builder);
}
protected abstract void OnConfigure(EntityTypeBuilder<TEntity> builder);
}
// In an extension class, I have
public static void ApplyInterfaceFields<TPrimaryKey, TEntity>(this EntityTypeBuilder<TEntity> builder) where TEntity : Entity<TPrimaryKey>
{
// Check other implementations (removed for brevity)
// IStatusField implementation
if (HasFieldType<TEntity, IStatusField<>())
{
builder.Property("Status")
.HasMaxLength(255)
.HasConversion(new EnumToStringConverter<>());
}
}
На момент проверки реализации IStatusField
я ничего не знаю об указанном типе generi c. Я думаю, что это может быть большая проблема ...