处理泛型接口时的解决方法
本文关键字:解决 方法 泛型接口 处理 | 更新日期: 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>
不同,即使TranslationImpl
从Translation
延伸。
我想到的另一件事是执行以下操作:
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<>)))