处理通用接口时的解决方法

时间:2014-12-05 12:07:39

标签: c# entity-framework generics interface

我有以下界面:

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>就足够了。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您无法确定某个类型是否使用is运算符实现了开放式通用接口,但您可以使用反射'

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