【问题标题】:How to find out the generic type passed to the parent如何找出传递给父级的泛型类型
【发布时间】:2020-09-14 15:20:10
【问题描述】:

请告诉我如何确定在继承期间传递给参数泛型的类型

public abstract class BaseEntity 
{
}

public class DogEntity : BaseEntity
{
}

public interface IAnimal
{
}

public abstract class Animal<TEntity> : IAnimal
    where TEntity : BaseEntity
{
}

public class Dog : Animal<DogEntity>
{
}

我只有 Dog 实体类型,我需要获取 DogEntity

Type type = typeof(Dog);

如果有任何帮助或提示,我将不胜感激

【问题讨论】:

  • typeof(Dog).BaseType.GenericTypeArguments[0]; 或许可以,但我在手机上,所以无法测试

标签: c# .net inheritance reflection


【解决方案1】:

Dog to Animal 是继承、多态的经典案例——不是泛型。就在那里,形状/圆形/球体。应该是DogEntity : AnimalEntity 和AnimalEntity : BaseEntity。这个继承链真的没有意义。

泛型的全部意义是您可以放入几乎任何类型,并且仍然具有编译时类型检查。您永远不必检查类型,编译器会为您完成。

如果您想知道具有 90% 概率的泛型类型,那么您没有泛型场景。您很可能正在重新发明压倒一切。我看到人们经常错误地倾向于泛型 + 类型检查,而普通的旧多态/覆盖将是答案。这可能是当今时代最常见的 XY 问题示例之一。

【讨论】:

  • 我给Dog和DogEntity的账号举了一个很抽象的例子,所以通过继承解决不了问题。在我的例子中,我在IEntityTypeConfiguration&lt;TEntity&gt; 和我的EntityConfiguration 之间创建了一个层。在运行时,保存时,我需要填写阴影属性,仅适用于那些在EntityConfiguration中配置了这个的TEntity
  • @АлексейДобров 不同实现的不同行为。从字面上看,这就是 Overriding 的发明目的。 |正如我所说,当您应该使用普通的旧覆盖时,使用typof() 或is 检查泛型 - 这是当今非常常见的 XY 问题案例。 | “在运行时,保存时,我需要填写 shadow 属性,仅针对那些”get-only bool 属性HasShadowProperty。 ShadowProperty setter 抛出一个异常,如果那个异常是假的。描述行为所需的一切。
  • 我正在重写 SaveChanges 方法,以便在 ChangeTracker.Entries 内部进行处理。此时,我检查了哪个ShadowProperty 已包含在EntityConfiguration 中(通过分配真/假),对于特定的TEntity。这是需要找到正确的EntityConfiguration&lt;TEntity&gt; 的地方。如果这可以更容易地完成,我将不胜感激
【解决方案2】:

使用反射

Type type = typeof(Dog)
    .BaseType
    .GetGenericArguments()
    .Single();

【讨论】:

  • 但是如果我继承了 Dog 的属性,例如class BigDog: Dog?如何以另一种方式而不是通过递归和.BaseType 验证到达实体Animal&lt;T&gt;?
  • @АлексейДобров 这听起来像是一个 XY 问题。为什么需要使用反射来获取类型?
  • 是的,我应该使用递归而不用担心它
  • @АлексейДобров 正如我在回答中所说:如果您需要在运行时使用泛型“找出”类型,那么您就是在重新发明覆盖。与大多数重新发明轮子的人一样,它比原来的更糟糕。
猜你喜欢
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
相关资源
最近更新 更多