我有以下界面:
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>
就足够了。
有什么想法吗?
答案 0 :(得分:0)
您无法确定某个类型是否使用is
运算符实现了开放式通用接口,但您可以使用反射'
if(entity.GetType().GetInterfaces().Any(x =>
x.IsGenericType &&
x.GetGenericTypeDefinition() == typeof(ITranslatable<>)))