【发布时间】:2014-12-05 12:07:39
【问题描述】:
我有如下界面:
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:对于上面的应用程序代码 sn-p,我真的不需要使用ICollection<TranslationImpl>,访问ICollection<Translation> 就足够了。
有什么想法吗?
【问题讨论】:
-
使用附加接口方法,是不是实现
ICollection<Translation> Translations属性explicitly 不适合您?实现ITranslatable<T>的对象将只有ICollection<T> Translations属性(嗯,它们确实有,但它被隐藏了),而实现ITranslatable的对象只有ICollection<Translation> Translations。 -
@hantoun 不能让对象实现
ICollection<Translation>,因为Translation是一个抽象类,EF 为它哭泣。但是,我确实希望能够将实现转换为接口,在那里我可以将属性获取为ICollection<Translation>,即使在实现时它们是ICollection<T>
标签: c# entity-framework generics interface