处理泛型接口时的解决方法

本文关键字:解决 方法 泛型接口 处理 | 更新日期: 2023-09-27 18:33:17

我有以下接口:

public interface ITranslatable<T> : IPersistableEntity where T : Translation {
    ICollection<T> Translations { get; set; }
}

如您所见,泛型类型参数只能是Translation类型或子类型。

在我的应用程序的其他地方,我有以下代码段:

foreach(E entity in entities) {
    if(entity is ITranslatable<?>)
      //Cast the entity and access the ICollection<?> property
}

正如你所看到的 我不知道作为类型参数传入什么。我不想像E那样通过泛型将该特定类型传递给该类,因为我只在那里使用它,我希望它是透明的。

entity is ITranslatable<Translation>不起作用,因为ITranslatable<Translation>ITranslatable<TranslationImpl>不同,即使TranslationImplTranslation延伸

我想到的另一件事是执行以下操作:

public interface ITranslatable : IPersistableEntity {
    ICollection<Translation> Translations { get; set; }
}
public interface ITranslatable<T> : ITranslatable where T : Translation {
    ICollection<T> Translations { get; set; }
}

但同样,在实现此接口时,我最终会得到两个不同的属性,这是冗余和丑陋的。

只是为了记录,我真的需要子类中的属性是Collection<TranslationImpl>而不是Collection<Translation>,因为EntityFramework不支持抽象类映射。

PS:我真的不需要对上面的应用程序代码片段使用 ICollection<TranslationImpl>,访问ICollection<Translation>就足够了。

有什么想法吗?

处理泛型接口时的解决方法

您无法确定类型是否使用 is 运算符实现开放 geenric 接口,但您可以使用反射来实现">

if(entity.GetType().GetInterfaces().Any(x =>
  x.IsGenericType &&
  x.GetGenericTypeDefinition() == typeof(ITranslatable<>)))